前言的前言:

最近小弟闲来无聊,就想到了在PPC上面来做个图像对比的小东东,查找各方资料,终于在今天初步完成了这个程序,现在整理之后和各位共勉。程序中还存在很多不足之处,大家尽管提出自己的意见和建议,本人非常欢迎哦!

前言:

在阅读本文后,你将知道:

  • 如何在.net Compact Framework 2.0框架下使用C#语言进行图片的缩放操作、保存
  • 如何在c#中计算图片的直方图量度
  • 如何使用SelectPictureDialog对话框

你需要以下开发环境:

  1. Visual Studio 2008
  2. Windows Mobile 6 Professional SDK(WM6可以直接运行我提供的例子,WM5也可以开发

正文:

第一步:我们先来创建一个C# 智能设备项目,我选用的是.net Compact Framework 2.0的框架库,然后选择 Windows Mobile 6 Professional SDK 平台。

在默认的Form1窗体中,我们如下图一样进行设计:

一个Label2用于显示对比结果、一个TabControl,tabPage1中有一个PictureBox1,tabPage2中同样放入一个PictureBox2,两个PictureBox的SizeMode属性设置为StretchImage。

设计好界面后,我们就添加代码,在这里只列出关键代码,详细代码请到下载的项目中查找吧。

在程序头部引用

using Microsoft.WindowsMobile.Forms;

using System.Drawing;

然后,添加全局变量:

PicCompare.GetHisogram.GetHis getHis = new PicCompare.GetHisogram.GetHis();//直方图度量计算类其中包括了图像缩放方法
string pic1 = @"Storage Card/test.bmp";//指定缩放后的图片存放位置和格式
string pic2 = @"Storage Card/test2.bmp";//指定缩放后的图片存放位置和格式
int[] pic1t;//图片一的直方图量度容器
int[] pic2t;//图片二的直方图量度容器

定义好变量后,我们双击“图片一”,给他添加如下代码:

Code
SelectPictureDialog spd = new SelectPictureDialog();
spd.ShowDialog();
pic1t = getHis.GetHisogram(getHis.Resized(spd.FileName, pic1));//计算出图片一的直方图量度存放到一个pic1t的数组变量中
Bitmap bmp=new Bitmap(spd.FileName);
            
pictureBox1.Image = bmp;//把处理后的图片放入pictureBox1进行预览

图片二按钮同上,只需修改相关参数即可。

然后我们看一下直方图量度计算类的部分代码实现吧:

计算图像的直方图的这个代码从网络上copy过来的,这个到处都有,我也不是太在行,所以暂不做解释了,汗~

计算图像的直方图
 /// <summary>
        /// 计算图像的直方图
        /// </summary>
        /// <param name="img">图片</param>
        /// <returns>返回直方图量度</returns>
        public int[] GetHisogram(Bitmap img)
        {
            
            BitmapData data = img.LockBits(new System.Drawing.Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int[] histogram = new int[256];
            unsafe
            {
                byte* ptr = (byte*)data.Scan0;
                int remain = data.Stride - data.Width * 3;
                for (int i = 0; i < histogram.Length; i++)
                    histogram[i] = 0;
                for (int i = 0; i < data.Height; i++)
                {
                    for (int j = 0; j < data.Width; j++)
                    {
                        int mean = ptr[0] + ptr[1] + ptr[2];
                        mean /= 3;
                        histogram[mean]++;
                        ptr += 3;
                    }
                    ptr += remain;
                }
            }
            img.UnlockBits(data);
            return histogram;
        }

下面的这个代码就是在分别计算完两张图片的量度后,把两个量度再放到这里面来计算结果,所得结果即为图片相似度的一个参考值,代码如下:

最终计算结果
        /// <summary>
        ///最终计算结果
        /// </summary>
        /// <param name="firstNum">图片一的直方图量度</param>
        /// <param name="scondNum">图片二的直方图量度</param>
        /// <returns>计算结果</returns>
        public float GetResult(int[] firstNum, int[] scondNum)
        {
            if (firstNum.Length != scondNum.Length)
            {
                return 0;
            }
            else
            {
                float result = 0;
                int j = firstNum.Length;
                for (int i = 0; i < j; i++)
                {
                    result += 1 - GetAbs(firstNum[i], scondNum[i]);
                    Console.WriteLine(i + "----" + result);
                }
                return result / j;
            }
        }

其中,还有一个类是用来处理图片大小的,在这里也贴出来,大家应该用得到的哦!

Code
 /// <summary>
        /// 图片大小缩放(正方形)
        /// 作者:Jack Fan
        /// </summary>
        /// <param name="sideSize">指定大小</param>
        /// <param name="srcBMP">原始图片</param>
        /// <returns>返回缩放后的Bitmap图片</returns>
        public Bitmap ResizeBMP(int sideSize, Bitmap srcBMP)
        {
            Bitmap bmp = new Bitmap(sideSize, sideSize);

Rectangle srcRec = new Rectangle(0, 0, srcBMP.Width, srcBMP.Height);
            Rectangle destRec = new Rectangle(0, 0, sideSize, sideSize);

Graphics g = Graphics.FromImage(bmp);
            g.DrawImage(srcBMP, destRec, srcRec, GraphicsUnit.Pixel);
            g.Dispose();

return bmp;
        }

对比按钮的代码:

对比按钮
 pictureBox1.Refresh();
pictureBox2.Refresh();
label2.Text = (getHis.GetResult(pic1t, pic2t) * 100).ToString() + "%";//计算最终结果

好了,代码就是这些了,下面来看看实际效果如何把:

1、程序运行后,添加了两张比较相似的图片(不同点请看第三张图片的红圈):

然后,点击“对比”按钮后,即可见到相似度了:

结尾:

在这里,我想申明一点,这个直方图量度来计算图片相似度的想法是我从园子里一个朋友Aaron Wu的blog上看来的,本想在前面附上他的署名,无奈今天无论如何都找不到他的原文,所以请见谅,您看到了就跟我说一声,毕竟我还有很多问题想请教一二啊!(原文名称《图像相似度算法的C#实现及测评》,在cnblogs里面好像搜不到了哦,大家股沟一下吧!)文中还有部分细节描述不清楚的地方,欢迎各位提问,在下文笔不好,只能是有问必答,呵呵。相信大家在看了源代码以及了解了相关直方图量度的知识后,会有另一番感觉。

另:在测试中,发现如果使用图片分割,再逐个部分进行对比,然后在汇总的方法,得出的结果就比较高了!但是无奈PPC设备硬件条件有限,暂时还不考虑。如果转载请注明原文归属哦,谢谢。

源代码:

点击下载

『原创』+『参考』基于PPC的图像对比程序——使用直方图度量相关推荐

  1. 基于VTK的MFC应用程序开发(2)

    基于VTK的MFC应用程序开发(2) 分类: VTK应用示例 2013-03-29 13:03 6647人阅读 评论(18) 收藏 举报 MFCVTK图像重采样 目录(?)[+] 现在基于VTK的MF ...

  2. 『简书API:jianshu 基于golang -- 用法介绍 (2)』

    首先我做这个项目的目的是朴素的: 熟悉golang 语法 通过这个项目呢,大家可以分析任意网站, 任意解析网站形成自己的API. 这个项目受项目:zhihu-go 影响.阅读完该项目的源码后,我立刻觉 ...

  3. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

    前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...

  4. 『深度学习项目四』基于ResNet101人脸特征点检测

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  5. 微软云盘配合服务器,『原创』开源5T微软云盘搭建教程onedrive index

    前言 为什么搭建一个微软共享云盘?百度云.蓝奏云不好吗?百度云有会员限制功能,各种限制更是不少,蓝奏云速度超快,但是貌似不支持大文件.微软毕竟是大厂,可用的5T教育邮箱现在也很好搞到,之所以采用是因为 ...

  6. 『原创』用C++开发WM应用系列(6)——深化ListBox控件

    用C++开发WM应用系列文章索引 引言: 在上一篇博文中,我们简单的学习了ListBox控件的项添加.项的全部清除.接上一篇的尾巴,我们将在这篇博文中,介绍一些ListBox的小技巧吧,比如,获取选中 ...

  7. 『TopCoder 组件开发指南』

    导读: 『TopCoder 组件开发指南』 Ⅰ. 简介 TopCoder 组件开发 TopCoder 组件开发使用的语言包括Java 和C#,尽管这两种语言有较大差别,但开发过 程却非常相似.本指南将 ...

  8. day01『NLP打卡营』实践课1:词向量应用演示

    Day01 词向量作业辅导 本教程旨在辅导同学如何完成 AI Studio课程--『NLP打卡营』实践课1:词向量应用展示 课后作业. 1. 选择词向量预训练模型 在PaddleNLP 中文Embed ...

  9. 射手科技公开课第一辑 『项目管理和代码规范』

    射手玩的东西越来越全面了,从当年的字幕下载站,到播放器,到射手科技,发展的思路值得借鉴和思考. 射手科技成立3个月以来,我们内部已经组织了不少培训.每次内部培训我们都留有录像和录音,以便后续参与项目的 ...

最新文章

  1. TaintDroid深入剖析之启动篇
  2. 第一个c++泛型函数(即模板)
  3. SpringCloud Zuul(四)之工作原理
  4. Python Itertools.chain()用法【将一组迭代对象串联起来,形成一个更大的迭代器】
  5. linux search用法,在Linux中使用ldapsearch只返回一个值
  6. 在一亿个数的有序数组中查找一个数所用时间
  7. js中的substr和substring
  8. 人与人之间需要最基本的信任
  9. mssql用户/角色无法查询sys.dm_tran_locks视图;消息 297,级别 16,状态 1,第 1 行 用户没有执行此操作的权限。
  10. 额定能量不得超过160Wh, 等同是多少mAh电池容量?
  11. 一个人摘了一些桃子,第一天卖掉了一半,又吃了一个,第二天卖掉了一半,又吃了一个,以后天天都是如此处理,到第n天发现桃子只剩下一个桃子,n是参数,返回值是一共摘的桃子数。 求两个数的最大公约数
  12. 一篇入门Android UI 设计
  13. 燕郊手机5G网络已全面覆盖,宽带提高至1000M!
  14. [C#] 使用 NAudio 实现音频可视化
  15. [转]从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA
  16. Linux卸载挂载点时,会遇到“device is busy”提示
  17. 2022-2027年中国海参行业市场调研及未来发展趋势预测报告
  18. 业务需求——Excel转 Json 以及相关优化
  19. 华为机试C语言-服务失效判断
  20. 入侵检测(IDS)技术知识小结

热门文章

  1. 上海交大、华为海思提出X-volution,发力网络核心基础架构创新
  2. SAP QM 含有Long-term检验特性的检验批UD完成后还能继续录入检验结果?
  3. SAP PM 入门系列4 - 如何手工触发一个新的PM检验批?
  4. 「SAP技术」SAP MM ME2N报表能按‘order acknowledgement‘查询采购订单
  5. 1750亿参数,史上最大AI模型GPT-3上线:不仅会写文章、答题,还懂数学
  6. AI重新定义边缘计算的重要性
  7. 科大讯飞裁员!提前就餐4秒被优化,员工们都这样议论
  8. Xmanager7如何通过SSH连接远程服务器
  9. 这些行业,将率先落地AI芯片 | 星前沿
  10. 拥有“上帝视角”是怎样的体验?高分多模卫星首批影像成果发布