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. SkyWalking的学习之一

    SkyWalking的学习之一 前言 最近在学习应用调优诊断等内容. 现在实际工作中实质上的拆分和微服务在售前阶段 所以真正用到链路的地方比较少. 但是人生都是要向前看的. 想着一方面提高自己. 一方 ...

  2. 飞腾CPU FT-2000/4 uboot下PHY调试记录

    飞腾爱好者技术交流群码公众号"乌拉大喵喵" 一.环境说明 板子是FT-2000/4的开发板: 固件版本: ft-2004c_u-boot-v2-Ver0.3_20211223100 ...

  3. Python 列表的修改、添加和删除元素

    列表修改.添加和删除元素 大多数创建的列表都是动态的,随程序的运行增删元素 修改列表元素 指定列表名和要修改的元素的索引,再指定要修改元素的新值 # 修改列表元素案例 motorcycles = [' ...

  4. GaussDB(DWS)网络流控与管控效果

    摘要:本文主要介绍GaussDB(DWS)网络流控能力,并对其管控效果进行验证. 本文分享自华为云社区<GaussDB(DWS)网络流控与管控效果>,作者:门前一棵葡萄树. 上一篇博文Ga ...

  5. HMS Core 6.10.0版本发布公告

    分析服务 ◆ 事件分析下新增商品订阅分析报告,帮助开发者了解应用内用户付费订阅概况,评估订阅付费价值: ◆ 营销分析.用户质量.转化分析以及过滤器中,新增广告系列/广告任务通过ID进行搜索的功能,通过 ...

  6. 金三银四好像消失了,IT行业何时复苏!

    疫情时候不敢离职,以为熬过来疫情了,行情会好一些,可是疫情结束了,反而行情更差了, 这是要哪样 我心中不由一万个 草泥 路过 我心中不惊有了很多疑惑和感叹 接着上一篇 一个28岁程序员入行自述和感受 ...

  7. 2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻

    2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上.一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻 ...

  8. 2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,

    2022-05-30:给定一个n*2的二维数组,表示有n个任务. 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务, ...

  9. Jenkins - Windows环境修改主目录路径

    Jenkins - Windows环境修改主目录路径 前言 如果Jenkins部署在Windows环境中,Jenkins主目录默认在 C:\Users\用户名\.jenkins下: 所有Jenkins ...

  10. SICP:元循环求值器(Python实现)

    求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看.这里顺便强烈推荐UC Berkeley的同名课程CS 61A. 在这个层次结构的最底层是对象语言.对象语言只 ...