㈠ C#怎么来判断2张图片相似度
很麻烦,而且计算量很大,这个属于人工智能的范畴。
如果这“两张相似图片”可以规定很多前提,比如相同分辨率,黑白,简单几何图形。。。那么可以用基本的算法去算一下“相似度”, 也就是楼上说的,读取两张照片的像素点,然后遍历去对比灰度差值。这些有很多现成的算法,也有很多网站提供这方面的计算(直接调用API即可),但是只能得出数字化的“相似度”。
如果你要的就是两张图片像素点之间的差异,那么就去找算法即可实现。
看一参考这个网站:www.aforgenet.com 这个是国外比较知名的图像处理的网站。
但是,两张图片如果尺寸不一呢? 如果比例不一样呢? 如果有留白呢?彩色的呢?
所以目前最成熟的编程算法也就是识别一下字母和数字(比如谷歌可以识别照片上的门牌号和街道号),人脸识别也只是拿几个标本部位来大致判断相似度(眼睛的大小,鼻梁的高度,脸颊的宽瘦和比例), 以人眼的标准完整的去比较两张图片是否一样是很难的,目前应该还没有这方面成熟的技术。
㈡ 如何使用opencv中的NCC算法实现两幅图像的相似性判断
图像相似度计算之哈希值方法OpenCV实现
分类: OpenCV Image Processing 2014-12-25 21:27 180人阅读 评论(0) 收藏 举报
感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。
实现步骤:
1. 缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;
2. 简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;
3. 计算平均值:计算所有64个像素的灰度平均值;
4. 比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;
5. 计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;
6. 得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。
㈢ 比较图片中人脸的相似程度是使用什么样的算法,并且计算得到眼睛,鼻子等相似程度有没有具体的实现
OPENCV里就有。安装后,DATA目录下,haarcascades目录下,haarcascade_frontalface_default.xml就不错。这是人脸识别的数据。
用法请根据这个文件名找吧,记得就是调用OPENCV里的某个函数(C++),用这个文件名和图作参数,返回的就是图中人脸的位置。
这里是你用得着的部分:
const char* cascadeFile = "haarcascade_frontalface_alt.xml";
const char* folder = "C:\\Program Files\\OpenCV\\data\\haarcascades\\";
char path[1024];
sprintf(path, "%s%s", folder, cascadeFile);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad(path, 0, 0, 0);
//然后cascade就存着需要的那个CvHaarClassifierCascade了。
......
CvSeq* faces = cvHaarDetectObjects(img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
cvSize(source->getWidth() >> 7, source->getHeight() >> 7));
这句中,img是一个IplImage*,我自己的项目是从摄像头弄来的,我估计你需要直接用opencv载入图片。cascade就是载入的OPENCV的样本数据,storage是一个空间,我用的CvMemStorage* storage = cvCreateMemStorage(0)创建的,detect objects之前我还用了cvClearMemStorage(storage),1.1是缩放,2是检测像素大小,CV_HAAR_DO_CANNY_PRUNING是比较方法, 一个OPENCV自带的常量。最后cvSize的返回值是允许的最小脸部大小。每个变量都解释到了吧。
之后faces->total就是找到几个脸。用cvGetSeqElem(faces, i)来取每个脸的数据,取出来的东西是(CvRect*),要记得TYPECAST,例如CvRect face1 = *((CvRect*) cvGetSeqElem(faces, 0))。这样得到的CvRect有4个变量face1.x,face1.y,face1.width,face1.height就是人脸在图片中的位置了。
㈣ matlab中画曲线对比图的问题
database infomastion
$db_info=array(
'h'=>'localhost',
'u'=>'root',
'pwd'=>'program',
'dbname'=>'agency'
);
$mysqli = new mysql($db_info);
$query = $mysqli->query("select * from user_list");
while($row=$mysqli->fetch_row($query)){
echo $row[1];
}
㈤ 图像比对的原理或者算法
有噪声情况下。1、配准;2、两张图的图像块分别计算特征(lbp,sift等);3、计算特征的距离(欧式距离等)。在matlab或opencv下都可以。
㈥ java 对比图片相似度的算法。。说说想法也行
每张图分成四块,将每部分的图片混成一种纯色,对比这四个纯色可以筛掉大部分的图片
㈦ matlab怎么把两个不同算法的仿真图放在一个图里作比较
在画完一张图后,加一条hold on语句,再画第二张图,以此类推,就可以在一张图上花画多条曲线,另外可以通过代码设置成不同颜色或者线形加以区分
㈧ 实现图片对比度和亮度的算法是什么
亮度就是一幅照片中的黑白灰分布情况,对比度是亮部和暗部的差距,饱和度就是颜色纯度