通过直方图对两幅图像进行比较,就是就是直方图数据,比较两幅图像的直方图的相似性,然后得出两图的相似系数。
这是早期图像检测的常用技术手段,通常与图像特征值,边缘检测等方法结合,可以简单迅速分析出两幅图像是否相似。
在MATLAB中,一般用函数 corr2()计算两图相关系数,要求图像为灰度图像,并且尺寸相同。而OpenCV就人性化很多了,采用compareHist()函数检测图像相似性,可以直接检测彩色图像,不要求图像尺寸,而且还提供了四种检测方法,然而有三种方法很坑,基本可以忽略。
MATLAB比较两图相似性
代码很简单,注意把彩色图像转为灰度图像即可
img1 = imread('data/IMG1.bmp');img2 = imread('data/IMG2.bmp');gray1 = rgb2gray(img1);gray2 = rgb2gray(img2);subplot(1,2,1); imshow(gray1);subplot(1,2,2); imshow(gray2);r = corr2(gray1, gray2);fprintf('两图像相似性: %f', r)
因为采用的是灰度图像,损失了两个像素通道,所以检测效果较差
![54acf02a025a573da678fd6ab8ead089.png](https://img-blog.csdnimg.cn/img_convert/54acf02a025a573da678fd6ab8ead089.png)
灰度图
![61ab2c44cd8fb6016bdd800de7085f0d.png](https://img-blog.csdnimg.cn/img_convert/61ab2c44cd8fb6016bdd800de7085f0d.png)
接近77%的相似性
c++比较两图相似性
c++操作稍显复杂,需要先进行彩色空间变换,变为hsv空间(一般而言直方图在hsv空间进行处理效果比较好),再获取直方图,然后进行归一化,才能进行检测。
openc提供了四种检测方法:相关性:HISTCMP_CORREL, 卡方:HISTCMP_CHISQR, 交叉HISTCMP_INTERSECT, 巴氏距离:HISTCMP_BHATTACHARYYA
#include #include using namespace cv;using namespace std;int main(int argc, char** argv) { Mat img1 = imread("data/images/IMG1.bmp"); Mat img2 = imread("data/images/IMG2.bmp"); imshow("image1