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

在OpenCV python中将白色像素转换为黑色,python,opencv,Python,Opencv,我正在尝试使用python OpenCV将输入图像的白色背景转换为黑色。但是所有的白色像素并没有完全转换为黑色。我已经附加了输入和输出图像 输入图像: 输出图像: 我已使用以下代码进行转换: img[np.where((img==[255,255,255]).all(axis=2))] = [0,0,0]; 我该怎么办?我认为图像中并非所有的“白色”像素都是[255255]。相反,设置一个阈值。尝试[220220]及以上,并将其转换为[0,0,0]。我认为图像中并非所有的“白色”像素都是[

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

输入图像:

输出图像:

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

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

我该怎么办?

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

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

我知道这已经得到了回答。我为您提供了一个编码的python解决方案

首先,我发现了如何删除白色像素的解释

结果是:

另一项测试img:

编辑 这是一种更好、更短的方法。在@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()
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()

[旧代码]

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()
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()
使用的其他来源:

我知道这个问题已经得到了回答。我为您提供了一个编码的python解决方案

首先,我发现了如何删除白色像素的解释

结果是:

另一项测试img:

编辑 这是一种更好、更短的方法。在@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()
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()

[旧代码]

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()
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()
使用的其他来源:

这可能会影响中心的亮黄色区域!转换为hsv可能有助于分割图像正如Jeru Luke所说,阈值[220220]会影响某些图像中的黄色区域。使用点击并试用。下一步尝试[230、230、230],如果它仍然影响黄色,则选择[235、235、235]以此类推。这种方法不能很好地扩展。无论您将阈值设置为什么,图像中的任何事件都将受到影响。问题很严重–OP不希望所有较亮的像素都转换为黑色,而只希望主图像周围的像素。这可能会影响中心的亮黄色区域!转换为hsv可能有助于分割图像正如Jeru Luke所说,阈值[220220]会影响某些图像中的黄色区域。使用点击并试用。下一步尝试[230、230、230],如果它仍然影响黄色,则选择[235、235、235]以此类推。这种方法不能很好地扩展。无论您将阈值设置为什么,图像中的任何事件都将受到影响。问题很严重–OP不希望所有较亮的像素都转换为黑色,而只希望主图像周围的像素。检测椭圆区域并遮罩itor外部的所有像素。例如,您可以先遮罩“近白色”图像,然后仅使用那些连接到图像边框的像素作为背景。检测椭圆区域并遮罩所有外部。例如,您可以先遮罩“近白色”然后只使用那些连接到图像边框的像素作为背景。虽然使用OpenCV its在Python中使用嵌套for循环逐像素迭代图像矩阵绝对不是一个好主意,使用Numpy语法总是比较可取的。虽然使用OpenCV its在Python中使用嵌套for循环逐像素迭代图像矩阵从来都不是一个好主意,但使用Numpy语法总是比较可取的。