查找两张图像差异的地方并标记 python版&c++版

python版已验证代码参考: 

# -*- coding: utf-8 -*-
from skimage.metrics import structural_similarity
import imutils
import cv2
# 加载两张图片并将他们转换为灰度
imageA = cv2.imread(r"1.jpg")
imageB = cv2.imread(r"2.jpg")

grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

# 计算两个灰度图像之间的结构相似度指数
(score,diff) = structural_similarity(grayA,grayB,full = True)
diff = (diff *255).astype("uint8")
print("SSIM:{}".format(score))

# 找到不同点的轮廓以致于我们可以在被标识为“不同”的区域周围放置矩形
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

# 找到一系列区域,在区域周围放置矩形
for c in cnts:
    (x,y,w,h) = cv2.boundingRect(c)
    cv2.rectangle(imageA,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.rectangle(imageB,(x,y),(x+w,y+h),(0,255,0),2)

#
  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用C#和OpenCV来对两张图像差异并标它们的位置,你可以使用以下步骤操作: 1. 引入必要的命名间: ```csharp using OpenCvSharp; using OpenCvSharp.Extensions; ``` 2. 加载两个输入图像: ```csharp Mat image1 = Cv2.ImRead("image1.jpg", ImreadModes.Color); Mat image2 = Cv2.ImRead("image2.jpg", ImreadModes.Color); ``` 3. 将图像转换为灰度图像: ```csharp Mat gray1 = new Mat(); Mat gray2 = new Mat(); Cv2.CvtColor(image1, gray1, ColorConversionCodes.BGR2GRAY); Cv2.CvtColor(image2, gray2, ColorConversionCodes.BGR2GRAY); ``` 4. 计算两个灰度图像差异: ```csharp Mat diff = new Mat(); Cv2.Absdiff(gray1, gray2, diff); ``` 5. 对差异图像进行二值化处理: ```csharp Mat threshold = new Mat(); Cv2.Threshold(diff, threshold, 30, 255, ThresholdTypes.Binary); ``` 6. 查找差异区域的轮廓: ```csharp Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(threshold, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); ``` 7. 标记差异区域的位置: ```csharp foreach (var contour in contours) { var rect = Cv2.BoundingRect(contour); Cv2.Rectangle(image1, rect, Scalar.Red, 2); } ``` 8. 显示带有标记图像: ```csharp Cv2.ImShow("Marked Image", image1); Cv2.WaitKey(0); ``` 9. 释放图像资源: ```csharp image1.Dispose(); image2.Dispose(); gray1.Dispose(); gray2.Dispose(); diff.Dispose(); threshold.Dispose(); ``` 上述代码将会对比两个输入图像并在第一个图像标记差异的位置。你可以根据自己的需求调整标记的颜色、线条粗细等参数。 希望这个示例对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值