使用openCV进行边缘检测二值化轮廓轮廓检测BGR灰度图二值化,专栏:各种openCV实践的案例

Posted dlage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用openCV进行边缘检测二值化轮廓轮廓检测BGR灰度图二值化,专栏:各种openCV实践的案例相关的知识,希望对你有一定的参考价值。

专栏连接:openCV练习-各种openCV实践的案例


前言

使用OpenCV的轮廓检测,当我们加入对象的边界上的所有点时,我们得到一个轮廓。 通常,特定轮廓区域与边界像素有关,具有相似的颜色和强度。 每当强度或颜色变化很大,那么几乎总是从那里开始一个新的轮廓区域。

环境:ubuntu、anaconda、python、vscode


基本步骤

1.读取图像并将其转换为灰度格式

import cv2
image = cv2.imread('/data/file/img/image_1.jpg')
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

2.应用二进制阈值

ret, thresh = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)

这里的ret是阈值,小于这个阈值的像素点的值会被改变为0,大于这个阈值的像素点的值会被改变为255。(我这里的ret的值是150)

thresh是应用阈值处理之后的二值化图像。

让我们来看一下二值化后的图像

在这里插入图片描述

可以看出边缘是很清晰的。

3.使用chain_approx_none绘制轮廓

contours, hierarchy = cv2.findContours(image=thresh, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)

image_copy = image.copy()
cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)

cv2.imshow('None approximation', image_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意,直接点击×掉显示的窗口不会使得程序停止,除非你再执行一个

cv2.destroyAllWindows()

正确关闭窗口的操作是点击图像后,按任意的键即可关闭图像。

在这里插入图片描述

这里在二值化后的图像找到边缘,然后将边缘画在原图上,就形成了上面的图片。

以上就是边缘检测的基本操作,下面的案例几乎都是和上面的操作类似。

4.使用单个通道:红色,绿色或蓝色

# 使用上面已经读取了的图像
# 将图像的B,G,R通道分开
blue, green, red = cv2.split(image)
contours1, hierarchy1 = cv2.findContours(image=blue, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
image_contours_blue = image.copy()
cv2.drawContours(image=image_contours_blue, contours=contours1, contourIdx=-1, 
                                color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)
cv2.imshow('Contours detection using blue channels only', image_contours_blue)
cv2.waitKey(0)
cv2.destroyAllWindows()

# detect contours using green channel and without thresholding
contours2, hierarchy2 = cv2.findContours(image=green, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
# draw contours on the original image
image_contour_green = image.copy()
cv2.drawContours(image=image_contour_green, contours=contours2, contourIdx=-1, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)
# see the results
cv2.imshow('Contour detection using green channels only', image_contour_green)
cv2.waitKey(0)
cv2.destroyAllWindows()

# detect contours using red channel and without thresholding
contours3, hierarchy3 = cv2.findContours(image=red, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
# draw contours on the original image
image_contour_red = image.copy()
cv2.drawContours(image=image_contour_red, contours=contours3, contourIdx=-1, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)
# see the results
cv2.imshow('Contour detection using red channels only', image_contour_red)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

可以看出使用单通道进行边缘检测都不是很准确。


总结

这个实验我们使用了openCV的轮廓和轮廓检测。

参考连接:https://learnopencv.com/contour-detection-using-opencv-python-c/#What-are-Contours

以上是关于使用openCV进行边缘检测二值化轮廓轮廓检测BGR灰度图二值化,专栏:各种openCV实践的案例的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV入门指南第四篇 图像的二值化

OpenCV-Python系列—— 图像处理(灰度图二值化边缘检测高斯模糊轮廓检测)

OpenCV-Python:轮廓

利用OpenCV进行图像的轮廓检测

OpenCV实现答题卡识别

OpenCV+python轮廓