首页 > 解决方案 > 用于查找差异图像的opencv阈值问题

问题描述

我有 2 张图片,如下所示。我想有两个不同。

我尝试了一些带有阈值的代码。但没有门槛不同。两幅图像阈值图像全黑。我怎样才能使脱粒上的白色与白色有所不同?

(区别就在左上角,就像一个小黑点)

before = cv2.imread('1.png')
after = cv2.imread('2.png')

threshb = cv2.threshold(before, 0, 255, cv2.THRESH_BINARY_INV)[1]
thresha = cv2.threshold(after, 0, 255, cv2.THRESH_BINARY_INV)[1]

cv.imshow("before",threshb)
cv.imshow("after",thresha)

不是:我在这里使用“structural_similarity”链接来查找差异,但它发现了很多差异:(

我不需要小的像素差异。我需要像用人眼看到的差异。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

标签: pythonimageopencvdifferencethreshold

解决方案


处理这个问题的方法是做 absdiff,然后在 Python/OpenCV 中有所收获。当您对这些图像进行 absdiff 时,差异很小,因此不会超过黑色。所以你必须增加增益才能看到差异。(或者您可以设置适当的阈值)

输入 1:

在此处输入图像描述

输入 2:

在此处输入图像描述

import cv2
import numpy as np
from skimage import exposure as exposure

# read image 1
img1 = cv2.imread('gray1.png', cv2.IMREAD_GRAYSCALE)

# read image 2
img2 = cv2.imread('gray2.png', cv2.IMREAD_GRAYSCALE)

# do absdiff
diff = cv2.absdiff(img1,img2)

# apply gain
result1 = cv2.multiply(diff, 5)

# or do threshold
result2 = cv2.threshold(diff, 10, 255, cv2.THRESH_BINARY)[1]

# save result
cv2.imwrite('gray1_gray2_diff1.png', result1)
cv2.imwrite('gray1_gray2_diff2.png', result2)

# display result
cv2.imshow('diff', diff)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果 1(增益):

在此处输入图像描述

结果 2(阈值):

在此处输入图像描述


推荐阅读