import cv2 as cv
import numpy as np
def threshold_demo(image):
# 去噪声+二值化
dst = cv.GaussianBlur(image,(3, 3), 0)
gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)
cv.imshow("binary", binary)
return binary
def canny_demo(image):
t = 100
canny_output = cv.Canny(image, t, t * 2)
cv.imshow("canny_output", canny_output)
return canny_output
src = cv.imread("yuan_test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
binary = threshold_demo(src)
canny = canny_demo(src)
# 轮廓发现
out, contours, hierarchy = cv.findContours(canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
for c in range(len(contours)):
cv.drawContours(src, contours, c, (0, 0, 255), 2, 8)
# 显示
cv.imshow("contours-demo", src)
cv.waitKey(0)
cv.destroyAllWindows()
定义阈值处理函数:
def threshold_demo(image): # 去噪声+二值化 dst = cv.GaussianBlur(image, (3, 3), 0) gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY) ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY) cv.imshow("binary", binary) return binary
这个函数接收一个图像作为输入,首先使用
cv.GaussianBlur
函数对图像进行高斯模糊,以去除噪声。然后,使用cv.cvtColor
将模糊后的图像转换为灰度图像。接着,使用cv.threshold
函数结合Otsu方法自动计算阈值,并将灰度图像转换为二值图像。最后,使用cv.imshow
显示二值图像,并返回二值图像。定义Canny边缘检测函数:
def canny_demo(image): t = 100 canny_output = cv.Canny(image, t, t * 2) cv.imshow("canny_output", canny_output) return canny_output
这个函数使用
cv.Canny
对输入图像进行Canny边缘检测,设置最小阈值t
为100,最大阈值是最小阈值的两倍。Canny边缘检测是一种非常流行的边缘检测算法,能够提供良好的边缘检测效果。函数显示边缘检测结果,并返回Canny边缘检测后的图像。读取源图像并显示:
src = cv.imread("yuan_test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src)
使用
cv.imread
读取名为"yuan_test.png"的图像文件,并将其存储在变量src
中。创建一个名为"input"的窗口,并使用cv.WINDOW_AUTOSIZE
参数设置窗口大小自适应图像大小。然后使用cv.imshow
在"input"窗口中显示原始图像。调用处理函数并保存结果:
binary = threshold_demo(src) canny = canny_demo(src)
调用前面定义的
threshold_demo
和canny_demo
函数,对源图像src
进行处理,并将处理后的二值图像和Canny边缘检测图像分别保存在变量binary
和canny
中。轮廓发现:
out, contours, hierarchy = cv.findContours(canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
使用
cv.findContours
函数在Canny边缘检测后的图像中发现轮廓。cv.RETR_TREE
参数表示检索所有轮廓及其层级关系,cv.CHAIN_APPROX_SIMPLE
参数表示存储轮廓的近似形式,以节省内存。绘制轮廓:
for c in range(len(contours)): cv.drawContours(src, contours, c, (0, 0, 255), 2, 8)
遍历所有轮廓,使用
cv.drawContours
函数在原始图像src
上绘制轮廓。每个轮廓使用蓝色(BGR值为(0, 0, 255))绘制,宽度为2,8
表示绘制所有八连通的点。显示轮廓结果:
cv.imshow("contours-demo", src)
创建一个名为"contours-demo"的窗口,并使用
cv.imshow
显示绘制了轮廓的原始图像。等待按键事件并关闭窗口:
cv.waitKey(0) cv.destroyAllWindows()