图像差分 (IplImage *) 版

简介:

//图像差分
#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"
#include <iostream>

using namespace std;

void Image_Minus(IplImage *X, IplImage *Y, IplImage *X_Y)
{
	//图像差分函数,将图像1中像素和图像2中对应像素想减,要求X、Y、X_Y大小相同
	int i,j,width,height,step,chanel;
	unsigned char *dataX, *dataY, *dataX_Y;

	width = X->width;
	height = X->height;

	//存入矩阵数据
	dataX = (unsigned char *)X->imageData;
	dataY = (unsigned char *)Y->imageData;
	dataX_Y = (unsigned char *)X_Y->imageData;

	//计算步长
	//step = X->widthStep/sizeof(char);
	step = X->widthStep/sizeof(uchar);
	chanel = X->nChannels;

	//一个个数据处理
	for(i=0; i<height; i++)
		for(j=0; j<width*chanel; j++)
		{
			//dataX_Y[i*step+j] = abs( dataX[i*step+j] - dataY[i*step+j]);

			//255是白色
			if(dataX[i*step+j] != dataY[i*step+j])
				dataX_Y[i*step+j]=150;

			else
				dataX_Y[i*step+j]=dataX[i*step+j];
		}
}


int main()
{
	IplImage* pImgX;
	IplImage* pImgY;
	IplImage* pImgX_Y;
	CvSize dest_size;
	pImgX = cvLoadImage("mmr_out.jpg", -1);
	pImgY = cvLoadImage("zcr_out.jpg", -1);

	//cvShowImage("先看看", pImgX);

	if(pImgX==0 || pImgY==0)
	{
		printf("载入文件失败!/n");
		return -1;
	}
	dest_size.width = pImgX->width;
	dest_size.height = pImgX->height;

	cout<<"width == "<<dest_size.width<<endl;
	cout<<"height == "<<dest_size.height<<endl;

	pImgX_Y = cvCreateImage(dest_size, pImgX->depth, pImgX->nChannels);
	
	//图像差分,最最关键的一步
	Image_Minus(pImgX, pImgY, pImgX_Y);


	//创建窗口
	cvNamedWindow("Picture X:", 1);
	cvNamedWindow("Picture Y:", 1);
	cvNamedWindow("Picture X-Y:", 1);
	//显示图像
	cvShowImage("Picture X:", pImgX);
	cvShowImage("Picture Y:", pImgY);
	cvShowImage("Picture X-Y:", pImgX_Y);
	cvWaitKey(0);
	//销毁窗口
	cvDestroyWindow("Picture X:");
	cvDestroyWindow("Picture Y:");
	cvDestroyWindow("Picture X-Y:");
	//释放图像
	cvReleaseImage(&pImgX);
	cvReleaseImage(&pImgY);
	cvReleaseImage(&pImgX_Y);
	return 0;
}



相关文章
|
3月前
什么是灰度图像
什么是灰度图像
101 0
|
8月前
|
计算机视觉
opencv 之 图像阈值处理
opencv 之 图像阈值处理
|
4月前
|
计算机视觉
OpenCV(八):图像二值化
OpenCV(八):图像二值化
52 0
|
4月前
|
算法 计算机视觉
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
36 0
|
6月前
OpenCV-Sobel边缘检测
OpenCV-Sobel边缘检测
|
6月前
|
计算机视觉
OpenCV-离散傅里叶变换cv::dft&cv::idft
OpenCV-离散傅里叶变换cv::dft&cv::idft
|
8月前
|
计算机视觉
opencv 之 图像基本形态学处理
opencv 之 图像基本形态学处理
|
11月前
|
资源调度 算法 API
OpenCV_06 图像平滑:图像噪声+图像平滑+滤波
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。
103 0
|
计算机视觉
CV15 轮廓检测:霍夫变换原理及应用
虽然图二中有多个交点,但我们主要关注的是三线相交的情况,这也是霍夫变换的后处理的基本方式:选择由尽可能多直线汇成的点
70 0
|
计算机视觉 异构计算