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;
else
nStretch = 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++图像处理函数及程序(一)的更多相关文章

  1. Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。

    Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...

  2. Matlab图像处理函数:regionprops

    本篇文章为转载,仅为方便学术讨论所用,不用于商业用途.由于时间较久,原作者以及原始链接暂时无法找到,如有侵权以及其他任何事宜欢迎跟我联系,如有侵扰,在此提前表示歉意.----------------- ...

  3. C语言函数与程序结构

    title : C语言函数与程序结构 tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义 grammar_cjkRuby: true --- 外部变量 变量声明用于说明变量 ...

  4. Hook ptrace 调试加入了ptrace函数的程序

    Hook ptrace 调试加入了ptrace函数的程序 #import <substrate.h> #if !defined(PT_DENY_ATTACH)#define PT_DENY ...

  5. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  6. flask实战-个人博客-使用工厂函数创建程序实例 --

    使用工厂函数创建程序实例 使用蓝本还有一个重要的好处,那就是允许使用工厂函数来创建程序实例.在OOP(Object-Oriented Programming,面向对象编程)中,工厂(factory)是 ...

  7. php GD 和图像处理函数, 用 STHUPO.TTF 字体向图像写入文本

    php GD 和图像处理函数,   用  STHUPO.TTF 字体向图像写入文本 注意: 01)   imagettftext() 这个函数不能使用相对路径, 要想使用相对路径要先使用  puten ...

  8. php GD 和图像处理函数, 制作一张图片

    php GD 和图像处理函数, 制作一张图片 // GD 和图像处理函数 // https://www.php.net/manual/zh/ref.image.php // https://www.p ...

  9. JS事件 什么是事件?JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。

    什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...

  10. php图像处理函数image_type_to_extension、image_type_to_mime_type 的区别

    php中获得图像类型的两个函数image_type_to_extension.image_type_to_mime_type,做图像处理的时候一直不清楚这俩个函数有什么区别,今天特意查了一下,有了一些 ...

随机推荐

  1. CSS页面布局方式

    css页面布局方式 1.标准流 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  2. 【译】ConfigureAwait FAQ

    .NET 在数年前就在语言和库中添加了 async/await.在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制.在 .NET 中也看到了大量的改进, ...

  3. SpringBoot应用集成微服务组件Nacos

    目录 springboot与微服务组件nacos Nacos服务快速启动 STS4 开发工具 Maven 环境配置 STS4开发工具引入Maven配置 Maven Repo配置阿里云镜像源 Sprin ...

  4. C#写一套最全的MySQL帮助类(包括增删改查)

    介绍说明:这个帮助类包含了六个主要的方法:ExecuteNonQuery.ExecuteScalar.ExecuteQuery.ExecuteQuery(泛型).Insert.Update和Delet ...

  5. [操作系统] - 进程切换&进程控制

    2.1.6 进程切换 名称解析 进程的上下文(Context) 当一个进程在执行时,CPU的所有寄存器的值.进程的状态以及堆栈中的内容被称为进程的上下文Context 进程的切换(switch) 当内 ...

  6. CF1738EBalance Addicts

    CF1738EBalance Addicts 原题: CF1738EBalance Addicts 目录 CF1738EBalance Addicts 题目大意 做法 思路 注意 code 题目大意 ...

  7. YOLO4论文中文版

    文章目录 YOLO4论文中文版 摘要 1.介绍 2.相关工作 2.1.目标检测模型 2.2.Bag of freebies 2.3.Bag of specials 3.方法 3.1.架构选择 3.2. ...

  8. 一文彻底搞懂ZAB算法,看这篇就够了!!!

    最近需要设计一个分布式系统,需要一个中间件来存储共享的信息,来保证多个系统之间的数据一致性,调研了两个主流框架Zookeeper和ETCD,发现都能满足我们的系统需求.其中ETCD是K8s中采用的分布 ...

  9. BugKu_never_give_up

    if(!$_GET['id']) { header('Location: hello.php?id=1'); exit(); } $id=$_GET['id']; $a=$_GET['a']; $b= ...

  10. Grafana系列-统一展示-6-Zabbix仪表板

    系列文章 Grafana 系列文章 Notes: 关于 Grafana系列-统一展示-6-Zabbix 数据源, 其实已经在之前的文章: 使用 Grafana 统一监控展示 - 对接 Zabbix 里 ...