C++图像处理函数及程序(一)
C++开源项目:
Boost.GIL:通用图像库
CImg :用于图像处理的小型开源C++工具包
CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。
FreeImage :开源库,支持现在多媒体应用所需的通用图片格式和其他格式。
GDCM:Grassroots DICOM 库
ITK:跨平台的开源图像分析系统
Magick++:ImageMagick程序的C++接口
MagickWnd:ImageMagick程序的C++接口
OpenCV : 开源计算机视觉类库
tesseract-ocr:OCR引擎
VIGRA :用于图像分析通用C++计算机视觉库
VTK :用于3D计算机图形学,图像处理和可视化的开源免费软件系统。
MakegGray 彩色转灰度
函数名称:MakegGray()
函数类型:void
功能:真彩色转化成256色灰度图像。
void MakeColorDib::MakegGray() //灰度变化
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数for(int j=0;j<height;j++) // 每行for(int i=0;i<DibWidth;i+=3) // 每列{BYTE* pbyBlue = p_data++; //得到蓝色值BYTE* pbyGreen = p_data++; //得到绿色值BYTE* pbyRed = p_data++; //得到红色值BYTE r = *pbyRed;BYTE g = *pbyGreen;BYTE b = *pbyBlue;//取到原r,g,b中的最大值作为像素三分量值的新值int gray=0;if(r>g)gray=r;else gray=g;if(gray<b)gray=b; *pbyBlue = gray; //将取到的最大值赋给像素的蓝分量*pbyGreen = gray; //将取到的最大值赋给像素的绿分量*pbyRed = gray; //将取到的最大值赋给像素的红分量}
}
LightAlter 亮度调整
函数名称:LightAlter(int m_Light)
函数类型:void
参数:int m_Light,用户给定的阈值
功能:对图像使用阈值法进行亮度调整
void MakeColorDib::LightAlter(int m_Light) //亮度调整
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数for(int j=0;j<height;j++) // 每行for(int i=0;i<DibWidth;i++) // 每列{ int a=0;a=int(*p_data*m_Light/100); //调整当前点的亮度*p_data=a;//判断范围,取得合理的值if(a<0) *p_data=0; if(a>255)*p_data=255;p_data++; //指向下一指针}
}
LightReverse 亮度取反
函数名称:LightReverse()
函数类型:void
功能:图像的亮度取反。
void MakeColorDib::LightReverse() //亮度取反
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数for(int j=0;j<height;j++) // 每行for(int i=0;i<DibWidth;i++) // 每列{int a=*p_data; //取得当前点的值*p_data=255-a; //取反p_data++; //指向下一指针 }
}
ContrastAlter 调整对比度(阈值法)
函数名称:ContrastAlter(int m_Increment)
函数类型:void
参数:int m_Increment,用户给定的阈值
功能:对图像使用阈值法调整对比度处理。
void MakeColorDib::ContrastAlter(int m_Increment) ///对比度处理
{int nHigh = 255 - m_Increment;//对于极端情况加以处理if(nHigh < m_Increment){nHigh = 127;m_Increment = 120;}if(m_Increment < -127)m_Increment = -120;//扩展或压缩区间的长度int nStretch = 255;if(m_Increment >= 0)nStretch = 255 - 2 * m_Increment;elsenStretch = 255 + 2 * m_Increment;BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数if(m_Increment >= 0) // m_Increment>=0时{for(int j=0;j<height;j++) // 每行for(int i=0;i<DibWidth-3;i+=3) // 每列{ //取得当前点(蓝色)的值,调整BYTE* pbyBlue = p_data++; if(*pbyBlue<=m_Increment)*pbyBlue=0;else if(*pbyBlue>nHigh)*pbyBlue=255;else*pbyBlue=(BYTE)((((int)*pbyBlue - m_Increment) * 255) / nStretch );//取得当前点(绿色)的值,调整BYTE* pbyGreen = p_data++;if(*pbyGreen<=m_Increment)*pbyGreen=0;else if(*pbyGreen>nHigh)*pbyGreen=255;else*pbyGreen=(BYTE)((((int)*pbyGreen - m_Increment) * 255) / nStretch );//取得当前点(红色)的值,调整BYTE* pbyRed = p_data++;if(*pbyRed<=m_Increment)*pbyRed=0;else if(*pbyRed>nHigh)*pbyRed=255;else*pbyRed=(BYTE)((((int)*pbyRed - m_Increment) * 255) / nStretch );}}else // m_Increment < 0 时{for(int j=0;j<height;j++)for(int i=0;i<DibWidth-3;i+=3){ //取得当前点(蓝色)的值,调整BYTE* pbyBlue = p_data++;*pbyBlue = (BYTE)((((int)(*pbyBlue) * nStretch) / 255) - m_Increment);//取得当前点(红色)的值,调整BYTE* pbyGreen = p_data++;*pbyGreen = (BYTE)((((int)(*pbyGreen) * nStretch) / 255) - m_Increment);//取得当前点(红色)的值,调整BYTE* pbyRed = p_data++;*pbyRed = (BYTE)((((int)(*pbyRed) * nStretch) / 255) - m_Increment); }}
}
Exposal 曝光处理
函数名称:Exposal()
函数类型:void
功能:图像曝光处理。
void MakeColorDib::Exposal() //曝光处理
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数for(int j=0;j<height;j++) // 每行for(int i=0;i<DibWidth;i++) // 每列{BYTE* pbydata = p_data++; //取得当前点的值BYTE a=*pbydata; //传给临时变量*pbydata=(a>128)?a:(255-a); //调整}}
PaintColor 着色处理(阈值法)
函数名称:PaintColor(int m_Red,int m_Green,int m_Blue)
函数类型:void
参数:int m_Red、m_Green、m_Blue,用户给定的红绿蓝值
功能:对图像使用阈值法进行着色处理。
void MakeColorDib::PaintColor(int m_Red,int m_Green,int m_Blue) //着色处理
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数for(int j=0;j<height;j++) // 每行for(int i=0;i<DibWidth;i+=3) // 每列{ BYTE* pbyBlue = p_data++; //取得当前点(蓝色)的值 BYTE* pbyGreen = p_data++; //取得当前点(绿色)的值BYTE* pbyRed = p_data++; //取得当前点(红色)的值BYTE r = *pbyRed;BYTE g = *pbyGreen;BYTE b = *pbyBlue;BYTE gray=(BYTE)(((WORD)r * 59 + (WORD)g * 30 + (WORD)b * 11) / 100);*pbyBlue = (BYTE)((m_Blue * gray) / 255); *pbyGreen = (BYTE)((m_Green * gray) / 255);*pbyRed = (BYTE)((m_Red * gray) / 255);}
}
NeonLight 霓虹处理
函数名称:NeonLight()
函数类型:void
功能:使图像产生霓虹处理效果。
void MakeColorDib::NeonLight() //霓虹处理
{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 平滑处理
函数名称: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 浮雕处理
函数名称: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 图像扩散
函数名称: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 锐化
函数名称: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 阈值法进行高通滤波
函数名称: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 图像低通滤波
函数名称: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))+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))//对应的第0行的值乘以矩阵对应值,再相加+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));}}memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像delete []p_temp; //删除暂时分配内存
}
LowVBObig 低通滤波
函数名称:LowVBObig()
函数类型:void
功能:实现函数低通滤波(5*5)
void MakeColorDib::LowLVBObig() //低通滤波(5x5)
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数int h[5][5];//定义(5x5)矩阵h[0][0] = 1; h[0][1] = 1; h[0][2] = 1; h[0][3] = 1; h[0][4] = 1;h[1][0] = 1; h[1][1] = 2; h[1][2] = 2; h[1][3] = 2; h[1][4] = 1;h[2][0] = 1; h[2][1] = 2; h[2][2] = 3; h[2][3] = 2; h[2][4] = 1;h[3][0] = 1; h[3][1] = 2; h[3][2] = 2; h[3][3] = 2; h[3][4] = 1;h[4][0] = 1; h[4][1] = 1; h[4][2] = 1; h[4][3] = 1; h[4][4] = 1;BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像for(int j=0;j<height-4;j++) // 每行{for(int i=0;i<DibWidth-14;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))+h[0][3]*(*(p_data+(height-j-1)*DibWidth+i+9))+h[0][4]*(*(p_data+(height-j-1)*DibWidth+i+12))//对应的第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))+h[1][3]*(*(p_data+(height-j-2)*DibWidth+i+9))+h[1][4]*(*(p_data+(height-j-2)*DibWidth+i+12))//对应的第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))+h[2][3]*(*(p_data+(height-j-3)*DibWidth+i+9))+h[2][4]*(*(p_data+(height-j-3)*DibWidth+i+12))//对应的第3行的值乘以矩阵对应值,再相加+h[3][0]*(*(p_data+(height-j-4)*DibWidth+i))+h[3][1]*(*(p_data+(height-j-4)*DibWidth+i+3))+h[3][2]*(*(p_data+(height-j-4)*DibWidth+i+6))+h[3][3]*(*(p_data+(height-j-4)*DibWidth+i+9))+h[3][4]*(*(p_data+(height-j-4)*DibWidth+i+12))//对应的第4行的值乘以矩阵对应值,再相加+h[4][0]*(*(p_data+(height-j-5)*DibWidth+i))+h[4][1]*(*(p_data+(height-j-5)*DibWidth+i+3))+h[4][2]*(*(p_data+(height-j-5)*DibWidth+i+6))+h[4][3]*(*(p_data+(height-j-5)*DibWidth+i+9))+h[4][4]*(*(p_data+(height-j-5)*DibWidth+i+12));//为了计算方便我们把除以35(矩阵权和)放在求总和之后*(p_temp+(height-j-3)*DibWidth+i+6)=abs(int(pby_pt/35));}}memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像delete []p_temp; //删除暂时分配内存
}
ShuiPingGROW 水平增强
函数名称:ShuiPingGROW()
函数类型:void
功能:使图像水平增强。
void MakeColorDib::ShuiPingGROW() //水平增强
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
int h[3][1];//定义(3x1)矩阵
h[0][0] = -1;
h[1][0] = 2;
h[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++) // 每列{int pby_pt=0;//对应的3行的值乘分别以矩阵对应值,再相加pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i));if(pby_pt>20)*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;else*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像delete []p_temp; //删除暂时分配内存
}
ChuiZhiGROW 垂直增强
函数名称:ChuiZhiGROW()
函数类型:void
功能:使图像垂直增强。
void MakeColorDib::ChuiZhiGROW() //垂直增强
{BYTE *p_data; //原图数据区指针int wide,height,DibWidth; //原图长、宽、字节宽p_data=this->GetData (); //取得原图的数据区指针wide=this->GetWidth (); //取得原图的数据区宽度height=this->GetHeight (); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数int h[1][3];//定义(1x3)矩阵h[0][0] = -1; h[0][1] = 2;h[0][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));if(pby_pt>20)*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;else*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);}}memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像delete []p_temp; //删除暂时分配内存
}
ShuangXiangGROW 双向增强
函数名称:ShuangXiangGROW()
函数类型:void
功能:使图像双向增强。
void MakeColorDib::ShuangXiangGROW() //双向增强
{
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] = 8; 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));if(pby_pt>20)*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;else*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
}
}
memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像
delete []p_temp; //删除暂时分配内存
}
Mosaic 马塞克
函数名称:Mosaic()
函数类型:void
功能:使图像产生马赛克效果。
void MakeColorDib::Mosaic() //马赛克
{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+=5) // 每行{ for(int i=0;i<DibWidth-14;i+=15) // 每列{ //对应周围(5x5)矩阵蓝色值求和平均int pby_pt=0;for(int m=0;m<5;m++)for(int n=0;n<15;n+=3){ pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n);}for(m=0;m<5;m++)for(int n=0;n<14;n+=3){*(p_temp+(height-j-1-m)*DibWidth+i+n)=int(pby_pt/25);} //对应周围(5x5)矩阵绿色值求和平均pby_pt=0;for(m=0;m<5;m++)for(int n=0;n<15;n+=3){pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n+1);}for(m=0;m<5;m++)for(int n=0;n<14;n+=3){*(p_temp+(height-j-1-m)*DibWidth+i+n+1)=int(pby_pt/25);}//对应周围(5x5)矩阵红色值求和平均pby_pt=0;for(m=0;m<5;m++)for(int n=0;n<15;n+=3){pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n+2);}for(m=0;m<5;m++)for(int n=0;n<14;n+=3){*(p_temp+(height-j-1-m)*DibWidth+i+n+2)=int(pby_pt/25);}} }memcpy(p_data,p_temp,height*DibWidth); // 复制处理后的图像delete []p_temp; //删除暂时分配内存
}
我的个人博客文章地址,欢迎访问
我的CSDN文章地址,欢迎访问
我的简书文章地址,欢迎访问
我的GitHub主页,欢迎访问
C++图像处理函数及程序(一)相关推荐
- Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。...
Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...
- 几种常用的图像处理函数库
from:http://www.wtoutiao.com/p/18a4MqP.html 几种常用的图像处理函数库 OpenCV OpenCV的全称是:Open Source Computer Visi ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- matlab图像处理函数
下列表格中除了个别函数外,其余函数都是图像处理工具箱提供的关于图像处理的函数,现摘录到此以备查找. 表1 图像显示 函数名 功能说明 函数名 功能说明 colorbar 颜色条显示 montage 按 ...
- php图像处理原生函数,php图像处理函数imagecopyresampled的用法
这篇文章主要介绍了php图像处理函数imagecopyresampled用法,结合实例形式详细分析了imagecopyresampled函数的功能.参数.使用方法,需要的朋友可以参考下 语法 代码如下 ...
- c语言中图像处理相关函数,C语言图像处理函数大全
C语言图像处理函数 没有积分,无私奉献,只希望多多支持,哈哈谢谢了 C语言图像处理函数大全,完整版 1.图像平移 图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化. 假设原图像区域左上角坐标为 ...
- itpt_TCPL 第四章:函数和程序结构
2016.08.30 – 10.09 个人英文阅读练习笔记(极低水准). 08.30 第四章:函数和程序结构 函数能够将大型的计算任务分解为多个小型的计算任务,并且程序员还能够利用别人已经编写好的函数 ...
- 图像处理函数详解——imadjust
功能: 调节灰度图像的亮度或彩色图像的颜色矩阵. 用法: J = imadjust(I,[low_in; high_in],[low_out; high_out],gamma) ...
- matlab怎么停止运行命令,MATLAB如何使用pause函数暂停程序运行
MATLAB如何使用pause函数暂停程序运行 [语法说明] oldstate=pause(newsyaye):pause函数用于暂停程序运行,这一功能是可以被关闭的.newstate和oldstat ...
最新文章
- 谷歌迈出量子计算开源第一步,推出首个量子机器学习库TensorFlow Quantum
- CGI、FastCGI 知识总结
- 实战项目三:爬取QQ群中的人员信息
- 前K个高频元素(top k)(TX)
- python while循环if_详解python基础之while循环及if判断
- android第一天-------环境搭建
- python爬虫登录网站_python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!...
- php 利用csv导,php 导入/导出 csv 文件
- 《Kotlin项目实战开发》 第3章 类型系统与可空类型
- 数据清洗之微博内容清洗
- Retrofit2 详解和使用(一)
- 《高等代数学》(姚慕生),例1.5.10
- TK1安装Caffe
- php mysql好学吗_零基础小白PHP开发好学吗
- 项目组数据库脚本的维护方案
- windows操作系统运用jacob转换文件,并添加水印
- UNREFERENCED_PARAMETER()宏函数
- 【零基础学STM32】CubeMX+HAL 喂狗小教程
- CDISC SDTMIG4.1.4.3 时间间隔和持续时间变量DUR的使用
- 【湍流】基于matlab kolmogorov结合次谐波补偿大气湍流相位屏【含Matlab源码 2178期】
热门文章
- node js+sql 后端分页查询效率越来越低解决方案
- Linux人才需求与Windows持平 职位“粥多僧少”
- 芒果不能用百度了,怎么办?
- 【pytorch】|tensor grad
- 共模电感的原理以及使用情况
- 学习笔记之js中导出表格到excel详解+源码
- 计算机用户管理权限有哪些,Windows系统管理员账户和普通账户的详细权限区别有哪些?...
- 面试了15位来自985/211高校的2020届研究生之后的思考
- Linux企业运维篇——git+gitlab+jenkins+docker构成持续集成环境
- 汉语拼音的5个声调该怎么学?