使用Python-OpenCV消除图像中孤立的小区域操作

  

当我们在处理图像时,有时会遇到一些孤立的小区域干扰我们的结果,这时我们可以使用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的区域进行了消除。

相关文章