在 OpenCV python 中将白色像素转换为黑色

Posted

技术标签:

【中文标题】在 OpenCV python 中将白色像素转换为黑色【英文标题】:Convert White Pixels to Black in OpenCV python 【发布时间】:2018-12-23 03:18:17 【问题描述】:

我正在尝试使用 python OpenCV 将输入图像的白色背景转换为黑色。但是所有白色像素都没有完全转换为黑色。我已附上输入和输出图像。

输入图像:

输出图像:

我使用了以下代码进行转换:

img[np.where((img==[255,255,255]).all(axis=2))] = [0,0,0];

我该怎么办?

【问题讨论】:

检测椭圆区域并掩盖它之外的所有区域 或者例如,您可以先屏蔽“近白”图像,然后仅将这些像素用作连接到图像边框的背景。 【参考方案1】:

我认为并非图像中的所有“白色”像素都是 [255,255,255]。相反,设置一个阈值。尝试 [220,220,220] 及以上并将它们转换为 [0, 0, 0]。

【讨论】:

这可能会影响中心的亮黄色区域! 转换为 hsv 可能有助于分割图像 正如 Jeru Luke 所说,阈值 [220,220,220] 正在影响某些图像中的黄色区域。 使用命中和试用。接下来试试[230, 230, 230],如果还是影响黄色,那就去[235, 235, 235]等等。 这种方法不能很好地扩展。无论您将阈值设置为什么,图像中出现的任何 项也会受到影响。问题指定得很糟糕 - OP 确实 想要将 所有 较亮的像素转换为黑色,而只希望将那些 围绕 主图像的像素转换为黑色。【参考方案2】:

我知道这已经得到了回答。我有一个编码的 Python 解决方案给你。

首先我找到this thread 解释如何去除白色像素。

结果:

另一个测试图像:

编辑 这是一种更好更短的方法。在@ZdaR 评论循环遍历图像矩阵后,我对其进行了研究。

[更新代码]

img = cv2.imread("Images/test.pnt")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY)

img[thresh == 255] = 0

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
erosion = cv2.erode(img, kernel, iterations = 1)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image", erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

Source

[旧代码]

img = cv2.imread("Images/test.png")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY)

white_px = np.asarray([255, 255, 255])
black_px = np.asarray([0, 0, 0])

(row, col) = thresh.shape
img_array = np.array(img)

for r in range(row):
    for c in range(col):
        px = thresh[r][c]
        if all(px == white_px):
            img_array[r][c] = black_px

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
erosion = cv2.erode(img_array, kernel, iterations = 1)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image", erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用的其他来源: OpenCV Morphological Transformations

【讨论】:

虽然使用 OpenCV,但在 Python 中使用嵌套的 for 循环逐像素迭代图像矩阵绝不是一个好主意,使用 Numpy 语法总是更可取。

以上是关于在 OpenCV python 中将白色像素转换为黑色的主要内容,如果未能解决你的问题,请参考以下文章

将白色像素区域合并为单个区域opencv c ++

在 Python 中将单个整数像素数组转换为 RGB 三元组

如何使用OpenCV将白色像素设置为透明

将 RGB 转换为黑色或白色

将RGB转换为黑色或白色

python+opencv2怎么将图像像素值转换为float64用于后续计算