当我们在处理图像时,有时会遇到一些孤立的小区域干扰我们的结果,这时我们可以使用Python-OpenCV库来消除它们。
下面是消除图像中孤立的小区域的完整操作攻略:
1.导入Python-OpenCV库
在Python代码开头,我们需要导入Python-OpenCV库,代码如下:
import cv2
2.读取图像
在代码中使用以下代码读取要处理的图像:
image = cv2.imread("image.jpg")
这里的"image.jpg"指的是我们需要处理的图像文件路径。在这个例子中,我们假设图像彩色。
3.将图像转换为灰度图像
对于简单的孤立的小区域消除操作,我们只需要处理灰度图像即可。我们可以使用以下代码将图像转换为灰度图像:
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
4.二值化处理
接下来,我们需要将灰度图像二值化,即将灰度图像中的像素值进行二分类,通常将较亮的像素设置为1,较暗的像素设置为0。此时,我们需要再次调用OpenCV库的cv2.threshold()函数,这个函数通过一个阈值来控制图像二值化的结果,示例如下:
ret, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
这里的参数解释如下:
- gray_image:转换为灰度的原始图像
- 127:阈值,当像素值大于阈值时,将像素设置为255,否则设置为0
- 255:阈值类型
- cv2.THRESH_BINARY:二值化类型
5.消除孤立的小区域
使用cv2.connectedComponents()函数,可以将图像中连通区域索引和连通区域大小的数组作为输出。我们可以指定cv2.connectedComponents算法中二值化后像素值为1表示的画素点(如0或1)。然后,cv2.connectedComponents()函数可以查找所有连通的区域,并返回它们的标志,低于某个尺寸的区域将被视为孤立的小区域,示例如下:
n_components, labels = cv2.connectedComponents(binary_image, connectivity=8)
for i in range(n_components):
if cv2.countNonZero(labels == i) <= 20:
binary_image[labels == i] = 0
在这里,我们对每个标记区域应用了cv2.countNonZero()函数,这个函数可以计算二值图像中具有非零像素值的像素数量(即区域的大小)。如果区域的大小低于我们设定的阈值,它将被视为一个孤立的小区域,接下来我们使用numpy的掩码操作移除它们。
6.显示输出结果
完成上述操作后,我们需要将处理后的图像显示出来。我们可以使用以下代码将图像显示出来:
cv2.imshow("result", binary_image)
cv2.waitKey(0)
前一行代码将结果显示在一个名为“result”的窗口中,后一行代码则等待用户关闭窗口后才会停止程序。
至此,我们已经完成了使用Python-OpenCV消除图像中孤立的小区域操作。下面给出两个使用OpenCV消除图像中孤立的小区域的示例:
示例一
以下是代码,这里的目标是从彩色图像中提取红色水管:
import cv2
import numpy as np
image = cv2.imread("pipe.jpg")
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
red_lower = (0, 70, 50)
red_upper = (10, 255, 255)
mask = cv2.inRange(hsv_image, red_lower, red_upper)
n_components, labels = cv2.connectedComponents(mask, connectivity=8)
for i in range(1, n_components):
if cv2.countNonZero(labels == i) <= 100:
mask[labels == i] = 0
cv2.imshow("result", mask)
cv2.waitKey(0)
首先,我们读取一张彩色图像,并将其转换为HSV颜色空间,然后使用inRange()函数创建一个掩码图像来只留下红色的部分。接着,我们使用cv2.connectedComponents()函数来计算连通区域,并使用cv2.countNonZero()函数计算每个区域的尺寸。最后,我们对尺寸小于100的区域进行了消除。
示例二
接下来的代码处理了一个二值图像并消除了其中的孤立区域。这里的目标是将一幅手写数字的图像中的噪点消除:
import cv2
import numpy as np
image = cv2.imread("digits_noisy.png")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
# 消除孤立小区域
n_components, labels = cv2.connectedComponents(binary_image, connectivity=8)
for i in range(1, n_components):
if cv2.countNonZero(labels == i) <= 5:
binary_image[labels == i] = 0
cv2.imshow("result", binary_image)
cv2.waitKey(0)
首先,我们读取一张二值数字图像。然后二值化图像并使用cv2.connectedComponents()来计算连通区域,并使用cv2.countNonZero()函数计算每个区域的尺寸。最后,我们对尺寸小于5的区域进行了消除。