比较两张图片的差异

本文介绍了在工作中处理图片比较需求时的两种方法:1) 使用Bitmap逐像素比较,简单但速度慢;2) 利用BitmapData提高比较速度,通过比较像素列表并标记差异。后者在处理大尺寸图片时表现更优。
摘要由CSDN通过智能技术生成

工作中经常遇到比较图片的需求,所以去网上搜索了一下,自己写了两个方法:


1. 直接使用Bitmap类对图片的每一个像素进行比较。

优点:简单

缺点:速度慢,当图片尺寸稍大的时候就会很慢(我的方法RemoveSinglePoints性能比较差,当存在差异的像素过多时会花费几十秒)

/// <summary>
/// Compare two images.
/// </summary>
/// <param name="img1">The first image path.</param>
/// <param name="img2">The second image path.</param>
/// <param name="imgDiff">The compare result image path.</param>
/// <param name="tolerance">The compare tolerance.</param>
/// <returns>If the two image are identical return true, else return false.</returns>
private bool CompareImage(string img1, string img2, string imgDiff, int tolerance = 10)
{
    // Load the images.
    Bitmap bm1 = (Bitmap)Bitmap.FromFile(img1);
    Bitmap bm2 = (Bitmap)Bitmap.FromFile(
在C#中,Emgu CV是一个开源的.NET版本的OpenCV库,它提供了处理计算机视觉任务的功能,包括图像处理、特征检测等。如果你想比较两张图片之间的差异,可以使用Emgu CV中的图像对比技术,如直方图对比、结构相似度(SSIM)、差分运算或模板匹配等。 以下是简单的步骤: 1. 加载图片:首先,你需要通过`Image<Bgr, byte>`或`Image<Gray, byte>`加载两幅图片,分别存储在`image1`和`image2`变量中。 ```csharp using Emgu.CV; using Emgu.CV.Structure; var image1 = new Image<Bgr, byte>("path_to_image1.jpg"); var image2 = new Image<Bgr, byte>("path_to_image2.jpg"); ``` 2. 图像对比方法选择: - 直方图对比:计算每张图片的像素值分布,然后比较它们是否相近。 - SSIM (结构相似性指数):这是一种常用的评估图片质量损失的指标,返回值范围从0到1,越接近1表示图片越相似。 - 差分运算:比如通过`AbsDiff`函数计算两个图像的绝对差,颜色变化越大差异就越大。 ```csharp double histogramDifference = Compare.Histogram(image1, image2); double ssimValue = StructuralSimilarity(image1, image2); Image<Gray, byte> diffImage = image1.Absdiff(image2); ``` 3. 结果分析:将上述得到的结果与其他阈值进行比较,如果差异超过某个阈值,则认为图片有显著差异。 ```csharp if (ssimValue < threshold || histogramDifference > maxDifference) { Console.WriteLine("图片有显著差异"); } else { Console.WriteLine("图片相似"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值