python - 用于查找差异图像的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”链接来查找差异,但它发现了很多差异:(
我不需要小的像素差异。我需要像用人眼看到的差异。
解决方案
处理这个问题的方法是做 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(阈值):
推荐阅读
- nuxt.js - 如何更新嵌套的 Apollo Cache 3+ 级别?
- python - 安装 scipy 时找不到库 mkl_rt、openblas、lapack - 如何更改库的标志
- javascript - PrimeNG p-table - 无法将项目(行)推入“选择”
- go - 从带有函数的切片中调用函数并获取返回值
- javascript - 反应原生的useEffect中的调用和API?
- python - 在 Google Collab 中重新启动和运行所有命令的命令?
- spring - 将挂载 Spring 微服务与 Docker 绑定导致 Eureka 未发现其他服务
- c - 为什么传递字符串和指向字符串的指针之间存在差异?
- vba - 有没有办法在连续表单上更改访问 VBA 中的文本框的字体属性?
- airflow - 气流 S3ToRedshiftTransfer