OpenCv图像差分(算法自己实现)

效果杠杠的!!

//图像差分
#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"
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);
	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]);
}
int main()
{
	IplImage* pImgX;
	IplImage* pImgY;
	IplImage* pImgX_Y;
	CvSize dest_size;
	pImgX = cvLoadImage("D://bishe//07_31_10_09_41_08.bmp", -1);
	pImgY = cvLoadImage("D://bishe//07_31_10_11_40_48.bmp", -1);

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

加注释版:

//图像差分
#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);
	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]);
}

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

	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;
}

OpenCv图像差分

时间: 2025-01-30 03:51:44

OpenCv图像差分(算法自己实现)的相关文章

图像差分 (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

OpenCV 图像力矩

OpenCV 图像力矩 目的 本文将带你学习: 使用 OpenCV 函数 moments 使用 OpenCV 函数 contourArea 使用 OpenCV 函数 arcLength 代码 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include &

opencv图像去噪点问题

问题描述 opencv图像去噪点问题 左图中,我用红圈标记了两个轮廓,其中一个我需要检测的裂纹的轮廓,而另一个是噪点的轮廓,由于裂纹的轮廓始终指向螺纹的圆心,而噪点没有这个特征,因此,我想要通过判断这两个轮廓的角度或者斜率,来排除掉噪点的干扰,想请教下大神,该怎么做

python opencv 图像按位操作

13-python opencv 图像按位操作 13-python opencv 图像按位操作 概述 实现过程 引用与读取图片 获取mask 根据logo大小提取感兴趣区域 将logo加到感兴趣区域 显示图片 源代码 运行结果 参考 概述 本节实现的是使用OpenCV里自带的函数,将一幅logo加到一张图片上去. 提取mask 利用mask生成带logo图片 实现过程 引用与读取图片 不再赘述,代码如下. import cv2 import numpy as np img = cv2.imrea

图像缩放算法【转】

转自:http://blog.csdn.net/qq_21792169/article/details/51020005 版权声明:本文为Linux_Google原创文章,转载请加上原创链接. 转载别人的,但是这篇文章写得确实太好了,所以想分享出来,可是原创文章地址找不到了 ,很可惜. 图像缩放算法   摘要:首先给出一个基本的图像缩放算法,然后一步一步的优化其速度和缩放质量: 高质量的快速的图像缩放 全文 分为:      上篇 近邻取样插值和其速度优化      中篇 二次线性插值和三次卷积

通用图像类算法扩充库

这是一个比较另类的图像库,它本身并不提供对图像对象的封装,只以类似插件的形式为您提供图像处理算法的封装和进度显示,而图像对象的封装则需由用户来提供.本图像库平台无关,理论上它可以应用于任何已有的C++图像类上.(具体原理请参看本人拙作:Crazybit开发手记(一):设计之数据结构和算法的分离). 使用方法 为了使用本图像库,您必须对手头的图像类做一些简单的修改(考虑到效率的因素,我并没有提供一个虚接口供大家继承,而是通过让用户自己修改代码来实现之.): 1.从现有图像类(如CxImage.CD

OpenCV 实现分水岭算法

种子点的标记没有太搞懂,这个算法的速度还是很快的     // watershed_test20140801.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // // ch9_watershed image // This is an exact copy of the watershed.cpp demo in the OpenCV ../samples/c directory // // Think about using a morpho

实现opencv图像裁剪分屏显示示例_C 语言

使用OPENCV图像处理库,将图片裁剪分屏显示 复制代码 代码如下: //#include "stdafx.h"#include <opencv2/opencv.hpp> //#include <opencv2/imgproc/imgproc.hpp>//#include <opencv2/highgui/highgui.hpp>#include <iostream>#include <vector>using namespa

【OpenCV】访问Mat图像中每个像素的值 (II)

今天百度搜资料还搜到了自己的...<访问图像中每个像素的值>,这是之前写的了,用的也是2.0的风格IplImage*格式,不太适用后来Mat的格式,特此重写一篇. 以下例子源自<The OpenCV Tutorials --Release 2.4.2>2.2 How to scan images, lookup tables and time measurement with OpenCV 图像容器Mat 还是先看Mat的存储形式.Mat和Matlab里的数组格式有点像,但一般是二