摘 要: 数字图片在人们生活中越来越普遍,随时随地拍照即可,已经成为人们生活中很重要的一部分,同时对图片处理的需求也越来越多。如何更好地处理图片,已经成为更多相关研究的重点。总结了一些常见的图片处理算法及相关图片处理软件,方便大家借鉴及应用。
0 引言
随着电子产品的快速进步,数字图片在人们生活中越来越普遍,随时随地可以拍照,图片处理的需求越来越普遍,不管用手机还是电脑,已经成为人们生活很重要的一部分。
目前图片处理软件特别多,各式各样的,受不同用户喜欢的。对于一般用户,网络上的图片处理软件够用了。对于特殊用户,想对图片的精细度要求更高的相关研究人员,或需要其他特殊处理等,网络上的处理软件是远远不够用的。这需要相关开发人员对不同人员的要求进行单独处理。
1 相关研究及图像处理软件
参考文献[1]介绍了制作缩略图、图片加水印、显示随机图像的过程实现,但没有具体实现过程和图片显示效果。参考文献[2]中分析了基于最不显著特征位替代(LSB)算法基本原理,并且对加密处理进行改进,加入输入像素预测和边界剩余信息分析压缩,通过VC+和编译平台实现过程。参考文献[3]主要研究如何将数字图像转换成色值矩阵的算法。
图像处理软件是用于处理图像信息的各种应用软件的总称,专业的图像处理软件有Adobe的Photoshop系列;基于应用的处理管理、处理软件Picasa等,还有国内很实用的大众型软件彩影,非主流软件有美图秀秀,动态图片处理软件有Ulead GIF Animator、gif movie gear等。
以上都是现有软件,功能固定,每一点的效果也是程序事先编程好的,如何做到随心处理,精确到每一点像素,通过功能内部处理图片的变化呢?
本文总结以下几个图片处理算法实例,详细说明对同一幅图片进行不同处理是如何变化其RGB值的。图片点的处理精确到每一个点的RGB,对图片处理要求达到精细。图片不同的显示效果可以根据自己的需求来调整。
本文主要使用C#语言,对图片的不同效果进行处理,使用的方法和调用的技术手段都不一样。
2 本文算法
下面是对某一图片的初始定义:
图片宽度:int Pheight;获取图片宽度:int pwidth;图片矩形:Rectangle rect;
初始化Bitmap对象:Bitmap mybmp;内存像素处理:BitmapData bmpdata;
(1)底片效果相关核心算法
算法的主要原理就是先获得每一点的像素值,然后再用255取反颜色值重新赋值到对应的点。
if(curbmp==null){return;}
unsafe{int offset=bmpdata.Stride-pwidth*3;
byte*bptr=(byte*)(bmpdata.Scan0);
for(intx=0;x<pwidth;x++)
{for(inty=0;y<Pheight;y++)
{ bptr[0]=(byte)(255-bptr[0]);bptr[1]=(byte)(255-bptr[1]);
bptr[2]=(byte)(255-bptr[2]);bptr+=3;}bptr+=offset;}//用255取反
curbmp.UnlockBits(bmpdata);}
this.effectPicbox.Image=curbmp;
(2)浮雕效果相关核心算法
此算法的原理主要是获得每一个像素的RGB值,再减去相邻像素的RGB值,然后加128得到新的RGB值赋值给原像素点。主要核心算法如下:
IntPtr ptr=mydata.Scan0;int pixels=Pwidth*Pheight*3;
byte[]rgbValues=new byte[pixels];Marshal.Copy(ptr,rgbValues,0,pixels);
int r=0,g=0,b=0;
for(int i=0;i<pixels-6;i+=3)
{r=Math.Abs(rgbValues[i+5]-rgbValues[i+2]+128);
//相邻像素R的值
g=Math.Abs(rgbValues[i+4]-rgbValues[i+1]+128);
b=Math.Abs(rgbValues[i+3]-rgbValues[i]+128);
if(r>255)r=255;if(r<0)r=0;if(g>255)g=255;if(g<0)g=0;
if(b>255)b=255;if(b<0)b=0;
rgbValues[i]=(byte)b;rgbValues[i+1]=(byte)g;rgbValues[i+2]=(byte)r;}
Marshal.Copy(rgbValues,0,ptr,pixels);mybmp.UnlockBits(mydata);
this.effectPicbox.Image=mybmp;
(3)黑白效果相关核心算法
将彩色数字图片处理成黑白效果通常有3种算法:
①最大值法:将每一个像素点的R、G、B中3个值等于其中的最大值。
②平均值法:将每一个像素点的R、G、B值等于原3个R、G、B值的平均值。
③加权平均值法:对每一个像素点的R、G、B值进行加权。
本文主要采用第3种加权平均值的算法主要的算法原理如下:首先获取每一点的RGB值,分别对每一个像素RGB赋不同的权值,赋给临时变量,然后获得的临时变量得到的值赋给原像素的RGB值,且RGB 3个值是相同的。
IntPtr ptr=mydata.Scan0;int bytes=pwidth*Pheight*3;byte[]rgbValues=new byte[bytes];
Marshal.Copy(ptr,rgbValues,0,bytes);byte temp=0;
for(int i=0;i<bytes-3;i+=3)
{temp=(byte)(rgbValues[i+2]*.58+rgbValues[i+1]*.22+rgbValues[i]*0.1);
rgbValues[i]=rgbValues[i+1]=rgbValues[i+2]=temp;}
//赋值
Marshal.Copy(rgbValues,0,ptr,bytes);mybmp.UnlockBits(mydata);
this.effectPicbox.Image=mybmp;}
catch(System.ArgumentException e){MessageBox.Show(e.ToString());}
(4)柔化效果相关核心算法
原理:利用高斯模板,将其每个像素点进行平滑处理,当前像素颜色值差距较大的像素和周围像素取平均值来进行平滑处理,整个图片变得很柔和。
int offset=bmpdata.Stride-pwidth*3;
unsafe{byte*ptr=(byte*)bmpdata.Scan0;//地址指针
int[]Gauss={1,2,1,2,4,2,1,2,1};//高斯模板
try{ptr+=bmpdata.Stride+3;
for(inti=1;i<pwidth-1;i++)
{for(intj=1;j<Pheight-1;j++)
{int r=0,g=0,b=0;int index=0;
for(int col=-1;col<=1;col++)
{for(int row=-1;row<=1;row++)
{byte*temp=ptr;temp=ptr+bmpdata.Stride*row+col*3;
r+=temp[2]*Gauss[index];g+=temp[1]*Gauss[index];b+=temp[0]*Gauss[index];
index++;}}
r/=16;g/=16;b/=16;if(r>255)r=255;if(r<0)r=0;if(g>255)g=255;
if(g<0)g=0;if(b>255)b=255;//边缘值的处理
if(b<0)b=0;
(ptr-bmpdata.Stride-3)[2]=(byte)r;(ptr-bmpdata.Stride-3)[1]=(byte)g;
(ptr-bmpdata.Stride-3)[0]=(byte)b;ptr+=3;}ptr+=offset;}}
catch(System.Exception e){MessageBox.Show(e.ToString());}}
mybmp.UnlockBits(bmpdata);this.effectPicbox.Image=mybmp;
(5)锐化效果相关核心算法
该算法的原理与上面的柔和主要核心代码差不多,但主要处理点不一样,此算法主要是利用拉普拉斯模版,突出颜色值比较大的像素点。核心代码不同处如下:
int[]Laplacian={-1,-1,-1,-1,9,-1,-1,-1,-1};
//拉普拉斯模板
r+=temp[2]*Laplacian[index];g+=temp[1]*Laplacian[index];b+=temp[0]*Laplacian[index];index++;}}
3 实验结果
图1~图6为实验效果图。
通过上面图片的效果可以看出,本文算法是真实有效的、可实施的。
4 结论
本文将常见的图片效果及相应的算法显示出来,通过相应的算法及实验结果可证明算法是可实施的。
现实中图片处理算法远不止这些,这里不再一一列举,本文列举一些常见图片处理算法的处理,供大家借鉴使用。其他图片处理算法主要原理也是在图片像素点上处理着手,可根据自己的想法,将图片处理成更多效果。
图片处理多种多样,视觉效果要求也千差万别,随着网络的发展将不断优化算法使其更加合理地应用。
参考文献
[1] 王涛.ASP动态网页图片的处理[J].佳木斯大学学报(自然科学版),2005,23(2):229-232.
[2] 余静,马博.基于LSB图像水印加密技术改进及实现[J].煤炭技术,2010,29(2):180-182.
[3] 张祖莲,王命全,李景林.基于图像色值转换算法[J].微型机与应用,2014,33(14):36-37.
[4] 王命全,张祖莲,李景林.防Web攻击的登录窗口程序设计[J].微型机与应用,2014,33(5):5-7.