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

相关文章
|
27天前
|
监控 算法 安全
基于 PHP 的员工电脑桌面监控软件中图像差分算法的设计与实现研究
本文探讨了一种基于PHP语言开发的图像差分算法,用于员工计算机操作行为监控系统。算法通过分块比较策略和动态阈值机制,高效检测屏幕画面变化,显著降低计算复杂度与内存占用。实验表明,相比传统像素级差分算法,该方法将处理时间缩短88%,峰值内存使用量减少70%。文章还介绍了算法在工作效率优化、信息安全防护等方面的应用价值,并分析了数据隐私保护、算法准确性及资源消耗等挑战。未来可通过融合深度学习等技术进一步提升系统智能化水平。
26 1
|
2月前
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
127 35
|
18天前
|
算法 安全 数据安全/隐私保护
基于AES的图像加解密算法matlab仿真,带GUI界面
本程序基于AES算法实现图像的加解密功能,并提供MATLAB GUI界面操作,支持加密与解密。运行环境为MATLAB 2022A,测试结果无水印。核心代码通过按钮回调函数完成AES加密与解密流程,包括字节替换、行移位、列混淆及密钥加等步骤。解密过程为加密逆向操作,确保数据安全性与完整性。完整程序结合128位块加密与可选密钥长度,适用于图像信息安全场景。
|
4月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
5月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
3月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
289 2
|
8月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
2467 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
4月前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
104 15
|
4月前
|
算法 数据安全/隐私保护
基于信息论的高动态范围图像评价算法matlab仿真
本项目基于信息论开发了一种高动态范围(HDR)图像评价算法,并通过MATLAB 2022A进行仿真。该算法利用自然图像的概率模型,研究图像熵与成像动态范围的关系,提出了理想成像动态范围的计算公式。核心程序实现了图像裁剪处理、熵计算等功能,展示了图像熵与动态范围之间的关系。测试结果显示,在[μ-3σ, μ+3σ]区间内图像熵趋于稳定,表明系统动态范围足以对景物成像。此外,还探讨了HDR图像亮度和对比度对图像质量的影响,为HDR图像评价提供了理论基础。
|
4月前
|
传感器 算法 数据安全/隐私保护
基于Affine-Sift算法的图像配准matlab仿真
本项目展示了Affine-SIFT算法的运行效果(无水印),适用于图像配准任务,能够处理旋转、缩放、平移及仿射变换。程序基于MATLAB2022A开发,包含完整代码与操作视频。核心步骤为:先用SIFT提取特征点,再通过仿射变换实现高精度对准。

热门文章

最新文章