图像差异:如何找到图像之间的细微差异
Image differencing: How to find minor differences between images?
为了安全起见,我想找到hwo来获得diff b/w 2类似的灰度图像,以便在系统中实现。我想检查一下他们之间是否有任何差异。对于对象跟踪,我在下面的程序中实现了canny检测。我很容易掌握结构化对象的轮廓。。该cn随后被减去以仅给出delta图像中的差的轮廓。。。。但是,如果第二张图像中存在非结构性差异,比如烟雾或火灾,该怎么办?我增加了对比度以进行更清晰的边缘检测,并修改了canny fn参数中的阈值vals。。但没有得到合适的结果。
canny边缘也可以检测阴影边缘。如果我的两张相似的照片是在一天中的不同时间拍摄的,阴影会变化,所以边缘会变化,并会产生不希望的错误警报
我该如何解决这个问题?有人能帮忙吗?谢谢visual studio 2010 中enter code here
opencv 2.4中使用c语言api
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include <math.h>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
IplImage* img1 = NULL;
if ((img1 = cvLoadImage("libertyH1.jpg"))== 0)
{
printf("cvLoadImage failedn");
}
IplImage* gray1 = cvCreateImage(cvGetSize(img1), IPL_DEPTH_8U, 1); //contains greyscale //image
CvMemStorage* storage1 = cvCreateMemStorage(0); //struct for storage
cvCvtColor(img1, gray1, CV_BGR2GRAY); //convert to greyscale
cvSmooth(gray1, gray1, CV_GAUSSIAN, 7, 7); // This is done so as to //prevent a lot of false circles from being detected
IplImage* canny1 = cvCreateImage(cvGetSize(gray1),IPL_DEPTH_8U,1);
IplImage* rgbcanny1 = cvCreateImage(cvGetSize(gray1),IPL_DEPTH_8U,3);
cvCanny(gray1, canny1, 50, 100, 3); //cvCanny( const //CvArr* image, CvArr* edges(output edge map), double threshold1, double threshold2, int //aperture_size CV_DEFAULT(3) );
cvNamedWindow("Canny before hough");
cvShowImage("Canny before hough", canny1);
CvSeq* circles1 = cvHoughCircles(gray1, storage1, CV_HOUGH_GRADIENT, 1, gray1->height/3, 250, 100);
cvCvtColor(canny1, rgbcanny1, CV_GRAY2BGR);
cvNamedWindow("Canny after hough");
cvShowImage("Canny after hough", rgbcanny1);
for (size_t i = 0; i < circles1->total; i++)
{
// round the floats to an int
float* p = (float*)cvGetSeqElem(circles1, i);
cv::Point center(cvRound(p[0]), cvRound(p[1]));
int radius = cvRound(p[2]);
// draw the circle center
cvCircle(rgbcanny1, center, 3, CV_RGB(0,255,0), -1, 8, 0 );
// draw the circle outline
cvCircle(rgbcanny1, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );
printf("x: %d y: %d r: %dn",center.x,center.y, radius);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
IplImage* img2 = NULL;
if ((img2 = cvLoadImage("liberty_wth_obj.jpg"))== 0)
{
printf("cvLoadImage failedn");
}
IplImage* gray2 = cvCreateImage(cvGetSize(img2), IPL_DEPTH_8U, 1);
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor(img2, gray2, CV_BGR2GRAY);
// This is done so as to prevent a lot of false circles from being detected
cvSmooth(gray2, gray2, CV_GAUSSIAN, 7, 7);
IplImage* canny2 = cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,1);
IplImage* rgbcanny2 = cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,3);
cvCanny(gray2, canny2, 50, 100, 3);
CvSeq* circles2 = cvHoughCircles(gray2, storage, CV_HOUGH_GRADIENT, 1, gray2->height/3, 250, 100);
cvCvtColor(canny2, rgbcanny2, CV_GRAY2BGR);
for (size_t i = 0; i < circles2->total; i++)
{
// round the floats to an int
float* p = (float*)cvGetSeqElem(circles2, i);
cv::Point center(cvRound(p[0]), cvRound(p[1]));
int radius = cvRound(p[2]);
// draw the circle center
cvCircle(rgbcanny2, center, 3, CV_RGB(0,255,0), -1, 8, 0 );
// draw the circle outline
cvCircle(rgbcanny2, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );
printf("x: %d y: %d r: %dn",center.x,center.y, radius);
}
您想要这里的代码帮助吗?这不是一项容易的任务。互联网上几乎没有可用的算法,或者你可以尝试发明一个新的算法。对此进行了大量研究。我对一个过程有一些想法。您可以从YCbCr
颜色系统中通过Y
找到边。从模糊图像的Y
值中推导出该Y
值。然后你就会获得优势。现在制作一个数组表示。你必须把图像分成块。现在用方块检查方块。它可以滑动、旋转、扭曲等。与阵列匹配相比。由于背景的原因,目标跟踪很困难。小心保管/忽略不必要的物品。
我认为应该采用背景减法。它使您能够应对照明条件的变化。
有关介绍,请参阅维基百科条目。基本思想是,您必须为场景背景建立一个模型,然后计算相对于背景的所有差异。
我对ImageDifferencing做了一些分析,但代码是为java编写的。请查看下面的链接,可能会帮助
如何找到两幅图像之间的差异矩形
干杯!
- OPENCV:如何使用5点算法从来自不同相机的两个图像之间的特征匹配来计算必需矩阵
- 从opencv的视频关注和标量拍摄的图像之间的整数划分
- 视差图和校正图像之间的叠加
- 如何在Python中实现ITK映像和SimpleItk图像之间的转换
- OpenCV Mahalanobis函数,用于计算两个图像之间的距离
- 图像操作2个图像之间的差异
- OpenCV:快速量化两个图像之间的差异
- 使用 lerp 在两个图像之间执行线性插值
- 在 OpenCV / C++ 中对应两个图像之间的值
- Xcode 中多个图像之间的交集
- 如何找出两个图像之间的对象差异
- 原始图像和调整大小的图像之间的关系(C++/OpenCV)
- 检测两幅图像之间的差异
- 图像差异:如何找到图像之间的细微差异
- 是否有可能得到两个图像之间的旋转和缩放只有一个冲浪描述符
- OpenCV中2个RGB图像之间的颜色一致
- OpenCV SURF -获得两个图像之间的旋转角度
- 从.oni文件中获取平面图像和深度图像之间的对应关系
- 在原始图像和转换图像之间进行插值
- 确定没有EXIF数据的图像之间的停止差异