📄 makecolordib.cpp
字号:
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
for(int j=0;j<height-4;j++) // 每行
{
for(int i=0;i<DibWidth-1;i++) // 每列
{
int pby_pt=0;
//对像素执行算法
pby_pt=(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i+3))
*(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i+3))
+(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-2)*DibWidth+i))
*(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-2)*DibWidth+i));
*(p_temp+(height-j-1)*DibWidth+i)=2*int(sqrt(pby_pt));
//判断合法性
if(*(p_temp+(height-j-1)*DibWidth+i)<0)
*(p_temp+(height-j-1)*DibWidth+i)=0;
if(*(p_temp+(height-j-1)*DibWidth+i)>255)
*(p_temp+(height-j-1)*DibWidth+i)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp; //删除暂时分配内存
}
/***************************************************************/
/*函数名称:Smoothness() */
/*函数类型:void */
/*功能:使图像平滑处理。 */
/***************************************************************/
void MakeColorDib::Smoothness() //平滑处理
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
int h[3][3];////定义(3x3)矩阵
h[0][0] = 1; h[0][1] = 1; h[0][2] = 1;
h[1][0] = 1; h[1][1] = 1; h[1][2] = 1;
h[2][0] = 1; h[2][1] = 1; h[2][2] = 1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
double pby_pt=0;
//对应的第0行的值乘以矩阵对应值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//对应的第1行的值乘以矩阵对应值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//对应的第2行的值乘以矩阵对应值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
*(p_temp+(height-j-2)*DibWidth+i+3)=abs(int(pby_pt/9));//取总和的的平均值
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp;//删除暂时分配内存
}
/***************************************************************/
/*函数名称:Embossment() */
/*函数类型:void */
/*功能:产生图像浮雕处理效果。 */
/***************************************************************/
void MakeColorDib::Embossment() //浮雕处理
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
for(int j=0;j<height;j++) // 每行
{
for(int i=0;i<DibWidth-4;i++) // 每列
{
int pby_pt=0;
//对像素得每个分量执行算法
pby_pt=*(p_data+(height-j-1)*DibWidth+i)
-*(p_data+(height-j-1)*DibWidth+i+3)+128;
*(p_temp+(height-j-1)*DibWidth+i+3)=pby_pt;
//检验合法性
if(*(p_temp+(height-j-1)*DibWidth+i+3)<0)
*(p_temp+(height-j-1)*DibWidth+i+3)=0;
else if(*(p_temp+(height-j-1)*DibWidth+i+3)>255)
*(p_temp+(height-j-1)*DibWidth+i+3)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp; //删除暂时分配内存
}
/***************************************************************/
/*函数名称:Spread() */
/*函数类型:void */
/*功能:图像扩散处理。 */
/***************************************************************/
void MakeColorDib::Spread() //扩散处理
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
for(int j=0;j<height-4;j++) // 每行
{
for(int i=0;i<DibWidth-14;i++) // 每列
{
int m=0,n=0;
m=rand()%5; //取得行随机数
n=rand()%5; //取得列随机数
int pby_pt=0;
pby_pt=*(p_data+(height-j-1-m)*DibWidth+i+3*n);//得到对应随机像素值
*(p_temp+(height-j-3)*DibWidth+i+6)=pby_pt;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp; //删除暂时分配内存
}
/***************************************************************/
/*函数名称:Sharp() */
/*函数类型:void */
/*功能:图像锐化处理。 */
/***************************************************************/
void MakeColorDib::Sharp() //图像锐化
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
BYTE *p_temp=new BYTE[height*DibWidth];
for(int j=0;j<height-1;j++) // 每行
{
for(int i=0;i<DibWidth-5;i++) // 每列
{
int pby_pt=0;
pby_pt= *(p_data+(height-j-2)*DibWidth+i+3)
-*(p_data+(height-j-1)*DibWidth+i);
*(p_temp+(height-j-2)*DibWidth+i+3)=*(p_data+(height-j-2)*DibWidth+i+3)
+abs(int(pby_pt/4));
if(*(p_temp+(height-j-2)*DibWidth+i+3)>255)
*(p_temp+(height-j-2)*DibWidth+i+3)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp; //删除暂时分配内存
}
/***************************************************************/
/*函数名称:HighLVBO(int m_GaoTong) */
/*函数类型:void */
/*参数:int m_GaoTong,用户给定的阈值来选择矩阵 */
/*功能:对图像使用阈值法进行高通滤波。 */
/***************************************************************/
void MakeColorDib::HighLVBO(int m_GaoTong) //高通滤波
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
int h[3][3]; ////定义(3x3)矩阵
if(m_GaoTong==1)
{ //矩阵1(基本高通)
h[0][0] =1; h[0][1] =-2; h[0][2] =1;
h[1][0] =-2; h[1][1] =5; h[1][2] =-2;
h[2][0] =1; h[2][1] =-2; h[2][2] =1;
}
else if(m_GaoTong==2)
{ //矩阵2(中等高通)
h[0][0] = 0; h[0][1] = -1; h[0][2] = 0;
h[1][0] = -1; h[1][1] = 5; h[1][2] = -1;
h[2][0] = 0; h[2][1] = -1; h[2][2] = 0;
}
else
{ //矩阵3(过量高通)
h[0][0] = -1; h[0][1] = -1; h[0][2] = -1;
h[1][0] = -1; h[1][1] = 9; h[1][2] = -1;
h[2][0] = -1; h[2][1] = -1; h[2][2] = -1;
}
BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
int pby_pt=0;
//对应的第0行的值乘以矩阵对应值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//对应的第1行的值乘以矩阵对应值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//对应的第2行的值乘以矩阵对应值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
*(p_temp+(height-j-2)*DibWidth+i+3)=abs(pby_pt);
if(pby_pt>255) //判断是否越界
*(p_temp+(height-j-2)*DibWidth+i+3)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp; //删除暂时分配内存
}
/***************************************************************/
/*函数名称:LowLVBO() */
/*函数类型:void */
/*功能:实现图像低通滤波(3x3)。 */
/***************************************************************/
void MakeColorDib::LowLVBO() //低通滤波(3x3)
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
double h[3][3];////定义(3x3)矩阵
h[0][0] = 0.1; h[0][1] = 0.1; h[0][2] = 0.1;
h[1][0] = 0.1; h[1][1] = 0.2; h[1][2] = 0.1;
h[2][0] = 0.1; h[2][1] = 0.1; h[2][2] = 0.1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
double pby_pt=0;
//对应的第0行的值乘以矩阵对应值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//对应的第0行的值乘以矩阵对应值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -