在不干扰原始图像的情况下将灰色背景转换为白色背景

时间:2019-08-20 07:35:59

标签: python opencv edge-detection image-comparison

我裁剪了一些背景为灰色的图像,需要将它们转换为白色背景才能与参考图像进行比较。

我实现了以下代码进行转换:

import cv2
im_gray = cv2.imread('gray_bg.png', cv2.IMREAD_GRAYSCALE)
(thresh, im_bw) = cv2.threshold(im_gray, 255, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imwrite('white_bg.png', im_bw)

输入: gray_bg.png

输出: white_bg.png

预期输出: ex_white_bg

如果您观察到,我的输出图像在原始图像的边缘有一些噪点(我希望我说的没错)。因此,在将我的输出与参考图像进行比较时,我没有得到所需的输出。有人可以建议我怎么做吗?

这是我们编写的用于比较两个图像的程序:

SourceImagePath = r'white_bg.png'
TemplateImagePath = r'ex_white_bg.png'
#def IconValidation(self,SourceImagePath,TemplateImagePath):
sourceImg=cv.imread(SourceImagePath)
templateImg=cv.imread(TemplateImagePath)
_,tempwidth,tempheight=templateImg.shape[::-1]
srcheight = np.size(sourceImg, 0)
srcwidth = np.size(sourceImg, 1)
if(srcwidth < tempwidth) and (srcheight < tempheight):
    print("comparison")

resultImg = cv.matchTemplate(sourceImg,templateImg,cv.TM_CCOEFF_NORMED)
matchVal = resultImg[0][0]
threshold=0.95
if(matchVal>threshold):
    print("passed")

else:
    print("failed")

2 个答案:

答案 0 :(得分:1)

避免更改颜色编码可获得最佳结果。这是代码:

im_gray = cv2.imread('gray_bg.png', cv2.IMREAD_UNCHANGED)
b, g, r = cv2.split(im_gray)

t = [None] * 3
u = [None] * 3
for i, im in enumerate([b, g, r]):
    t[i], u[i] = cv2.threshold(im, 255, 255, cv2.THRESH_BINARY + cv2.THRESH_TRIANGLE)

dst = cv2.merge((*u,))
cv2.imwrite('white_bg.png', dst)

通过与原始版本进行比较,可以得出99.99%相等。

如果您真的需要它,可以使用cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)将图像转换为灰度编码。

结果与需求:

Obtained image Wanted image

答案 1 :(得分:1)

您看到的是混叠,而不是杂音。之所以出现,是因为门槛很高。

您输入的图像确实有一点点噪点,可以通过放大(可能是由于某些阶段的有损压缩)看到的,但是它没有混叠。

enter image description here

您可以通过应用1.4的增益(灰度级为180左右)将灰色背景变为白色,同时保持黑色。这样可以避免引入别名。

enter image description here