栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++图像加减乘除运算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++图像加减乘除运算

写在前面:
图像镜像和双线性变换BUG太多,花了一个下午没调通,所以暂时没这些代码。主要问题处在没搞懂RGB三通道图像的镜像,我觉得只要左右两边对称元素交换就行了,但是效果不理想。双线性变换插值之后在显示过程中也有报错,可能是哪个地方没清理动态内存。

工程链接

文章结构:
1.运算类的代码

**

运算类

**
H文件

#pragma once




#include "USER_DEFINE.h"


class USER_ARITHMETIC
{
	//variable 
	public:


	protected:

	private:
		BYTE* pixelArray1;
		BYTE* pixelArray2;
		BYTE* pixelArrayNew;
		int  ArraySize;
		BYTE* R_array1; //图1 RGB三个分量分别做滤波
		BYTE* G_array1;
		BYTE* B_array1;

		BYTE* R_array2; //图2 RGB三个分量分别做滤波
		BYTE* G_array2;
		BYTE* B_array2;

	//function
	public:
		USER_ARITHMETIC(BYTE* ARRAY1, BYTE* ARRAY2, int ARRAYSIZE, BYTE* ARRAY3);
		~USER_ARITHMETIC();
		void Add(); // + 
		void Sub(); // -
		void Mul(); // *
		void Div(); // /
	protected:
		void SeparateRGB();

	private:
		void TwoPicAdd();
		void TwoPicSub();
		void TwoPicMul();
		void TwoPicDiv();

};


CPP文件

#include "pch.h"
#include "USER_ARITHMETIC.h"




USER_ARITHMETIC::USER_ARITHMETIC(BYTE* ARRAY1, BYTE* ARRAY2, int ARRAYSIZE, BYTE* ARRAY3)
{
	pixelArray1 = ARRAY1;
	pixelArray2 = ARRAY2;
	pixelArrayNew = ARRAY3;
	ArraySize = ARRAYSIZE;

	R_array1 = (BYTE*)new char[ArraySize / 3 + 1];
	G_array1 = (BYTE*)new char[ArraySize / 3 + 1];
	B_array1 = (BYTE*)new char[ArraySize / 3 + 1];

	R_array2 = (BYTE*)new char[ArraySize / 3 + 1]; 
	G_array2 = (BYTE*)new char[ArraySize / 3 + 1];
	B_array2 = (BYTE*)new char[ArraySize / 3 + 1];
}


USER_ARITHMETIC::~USER_ARITHMETIC()
{
	delete[] R_array1;
	delete[] G_array1;
	delete[] B_array1;
	delete[] R_array2;
	delete[] G_array2;
	delete[] B_array2;
}





void USER_ARITHMETIC::Add()
{
	SeparateRGB();
	TwoPicAdd(); //实现两幅图像RGB三通道分别相加
}


void USER_ARITHMETIC::Sub()
{
	SeparateRGB();
	TwoPicSub(); //实现两幅图像RGB三通道分别相加
}


void USER_ARITHMETIC::Mul()
{
	SeparateRGB();
	TwoPicMul(); //实现两幅图像RGB三通道分别相加
}


void USER_ARITHMETIC::Div()
{
	SeparateRGB();
	TwoPicDiv(); //实现两幅图像RGB三通道分别相加
}







void USER_ARITHMETIC::SeparateRGB()
{
	int j = 0;
	for (int i = 0; i < ArraySize; i = i + 3)
	{
		R_array1[j] = pixelArray1[i + 2];
		G_array1[j] = pixelArray1[i + 1];
		B_array1[j] = pixelArray1[i + 0];

		R_array2[j] = pixelArray2[i + 2];
		G_array2[j] = pixelArray2[i + 1];
		B_array2[j] = pixelArray2[i + 0];

		j++;
	}
}



void USER_ARITHMETIC::TwoPicAdd()
{
	int j = 0;
	for (int i = 0; i < ArraySize; i = i + 3)
	{
		pixelArrayNew[i + 2] = R_array1[j] + R_array2[j];
		pixelArrayNew[i + 1] = G_array1[j] + G_array2[j];
		pixelArrayNew[i + 0] = B_array1[j] + B_array2[j];
		pixelArrayNew[i + 2] = pixelArrayNew[i + 2] > 255 ? 255 : pixelArrayNew[i + 2];
		pixelArrayNew[i + 1] = pixelArrayNew[i + 1] > 255 ? 255 : pixelArrayNew[i + 1];
		pixelArrayNew[i + 0] = pixelArrayNew[i + 0] > 255 ? 255 : pixelArrayNew[i + 0];
		j++;
	}
}



void USER_ARITHMETIC::TwoPicSub()
{
	int j = 0;
	for (int i = 0; i < ArraySize; i = i + 3)
	{
		pixelArrayNew[i + 2] = R_array1[j] - R_array2[j];
		pixelArrayNew[i + 1] = G_array1[j] - G_array2[j];
		pixelArrayNew[i + 0] = B_array1[j] - B_array2[j];
		pixelArrayNew[i + 2] = pixelArrayNew[i + 2] < 0 ? 0 : pixelArrayNew[i + 2];
		pixelArrayNew[i + 1] = pixelArrayNew[i + 1] < 0 ? 0 : pixelArrayNew[i + 1];
		pixelArrayNew[i + 0] = pixelArrayNew[i + 0] < 0 ? 0 : pixelArrayNew[i + 0];
		j++;
	}
}


void USER_ARITHMETIC::TwoPicMul()
{
	int j = 0;
	for (int i = 0; i < ArraySize; i = i + 3)
	{
		pixelArrayNew[i + 2] = R_array1[j] * R_array2[j];
		pixelArrayNew[i + 1] = G_array1[j] * G_array2[j];
		pixelArrayNew[i + 0] = B_array1[j] * B_array2[j];
		pixelArrayNew[i + 2] = pixelArrayNew[i + 2] > 255 ? 255 : pixelArrayNew[i + 2];
		pixelArrayNew[i + 1] = pixelArrayNew[i + 1] > 255 ? 255 : pixelArrayNew[i + 1];
		pixelArrayNew[i + 0] = pixelArrayNew[i + 0] > 255 ? 255 : pixelArrayNew[i + 0];
		j++;
	}
}


void USER_ARITHMETIC::TwoPicDiv()
{
	int j = 0;
	for (int i = 0; i < ArraySize; i = i + 3)
	{
		pixelArrayNew[i + 2] = (int)(R_array1[j] / (R_array2[j] + 1));
		pixelArrayNew[i + 1] = (int)(G_array1[j] / (G_array2[j] + 1));
		pixelArrayNew[i + 0] = (int)(B_array1[j] / (B_array2[j] + 1));
		j++;
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395909.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号