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

Python 在不干扰原始图像的情况下,将灰色背景转换为白色背景,python,opencv,edge-detection,image-comparison,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) 输入

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

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

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)
输入:

输出:

预期产出:

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

下面是我们编写的用于比较两幅图像的程序:

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")
SourceImagePath=r'white\u 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]
srchheight=np.size(sourceImg,0)
srcwidth=np.size(sourceImg,1)
如果(srcwidth阈值):
打印(“通过”)
其他:
打印(“失败”)

避免颜色编码的更改可获得最佳效果。代码如下:

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\u bgr2 gray)
将图像转换为灰度编码

结果vs需要:


您看到的是混叠,而不是噪声。它的出现是因为硬阈值

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

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


了解如何将输出与预期输出进行比较会很有用;考虑到这是引发问题的操作。更新了代码。请注意您的问题的更新,为了更好地回答您的需求,如果您还共享模型图像以及您是如何获得它的,这将非常有用,以便其他人可以测试比较是否失败。为了进行比较,我使用了图像像素总和的差值(以百分比表示)。这根本不能解决二值化引起的问题。亲爱的@yvesdao谢谢您的考虑。如果你读得很好,你会看到这样一个问题:“因此,在将我的输出与参考图像进行比较时,我没有得到所需的输出。”在我所做的所有测试中,我给出的代码示例给出了最好的相等性比较结果。我没有像你那样处理噪音问题,但至少我给出了一些工作代码。你不明白。您没有避免别名,并且您的输出与OP获得的结果相同。放大图像,无需插值即可查看。