写在前面:
图像镜像和双线性变换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++;
}
}



