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

相关文章
|
6天前
|
人工智能 算法 JavaScript
【算法】前缀和与差分
算法学习——前缀和与差分(含一维和二维)
13 4
【算法】前缀和与差分
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
|
8天前
|
算法
基于粒子群优化的图像融合算法matlab仿真
这是一个基于粒子群优化(PSO)的图像融合算法,旨在将彩色模糊图像与清晰灰度图像融合成彩色清晰图像。在MATLAB2022a中测试,算法通过PSO求解最优融合权值参数,经过多次迭代更新粒子速度和位置,以优化融合效果。核心代码展示了PSO的迭代过程及融合策略。最终,使用加权平均法融合图像,其中权重由PSO计算得出。该算法体现了PSO在图像融合领域的高效性和融合质量。
|
1月前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
11天前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
1月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
34 1
|
1月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
22 1
|
28天前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
28 0
|
1月前
|
机器学习/深度学习 编译器 算法框架/工具
OpenCV算法库
numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。
|
1月前
|
机器学习/深度学习 算法 数据挖掘
机器学习之聚类——MeanShift算法和图像矢量量化
机器学习之聚类——MeanShift算法和图像矢量量化
23 0

热门文章

最新文章