一、软件设计的基本原理和采用的主要方法(算法)与技术
算法:图像读入后,把数据放到数组中去。
灰度化用的是最终像素=0.3*R+0.59*B+0.11*G这个公式
反色使用255减去原像素得到最终像素
怀旧效果用的是0.393*R+0.769*G+0.189*B
高斯模糊用的是矩阵的卷积远算,算子是1/16{1,2,1,2,4,2,1,2,1},高斯模糊在模糊的同时有考虑每个像素的比重,所以边缘得以保留下来。
拉普拉斯用的3*3的算子,{1,1,1,1-8,1,1,1,1}
素描效果的实现参考了ps中的图层,第一个图层是灰度图,第二个图层是灰度图反相,然后用最小值滤波,最后是两个图层叠加。
图层的叠加,以灰度图为基色,处理过的图层为混合色,结果色=基色+基色*混合色/(255-混合色),最终会使基色图朝变亮的方向发展,对比度增加。
四、实现的过程与步骤
(用visio画出软件架构并解释)
五、遇到的困难与获得的主要成果
困难:Android平台的Bitmap的一些特性不太熟悉,Bitmap在内存中的存贮格式不太清楚,以及canvas的一些属性和ColorMatrix第一次接触。
主要成果:Bitmap加深了了解,Android平台绘图的基础知识有了一个大概的全貌,细节方面还要查api。
六、测试与运行记录
测试效果、结果
左边是ps上做的效果,右边是我的软件实现的效果。
七、结果分析与小结
开发任务基本上达到,图像处理的基础算法有了一个比较深入的了解,特别是大概实现了图像素描的算法,滤镜开发的基础算法也比较熟悉了,总的来说,收获很大。
八、附录(软件配置、含注释的程序模块核心代码)
public staticBitmap oldbmp(Bitmap bmp){ intwidth=bmp.getWidth(); intheight=bmp.getHeight(); Config config=bmp.getConfig(); Bitmap bitmap=bmp.createBitmap(width, height,Bitmap.Config.RGB_565);//创建一个新的bitmap intpixColor; intpixR,pixG,pixb; intnewColor; intnewr,newg,newb; int[]pixs=new int[width*height]; bmp.getPixels(pixs, 0, width, 0, 0, width,height);//把bitmap中的像素提取到pixs数组中去 for(int i=0;i<height;i++){ for(int j=0;j<width;j++){ pixColor=pixs[i*width+j];//分别得到rgb三个通道 pixR=Color.red(pixColor); pixG=Color.green(pixColor); pixb=Color.blue(pixColor); newr=(int)(0.393 * pixR + 0.769 * pixG + 0.189* pixb);//怀旧效果的公式 newb=(int)(0.272* pixR + 0.534 * pixG + 0.131 * pixb); newg=(int)(0.349 * pixR + 0.686 * pixG + 0.168* pixb); newColor=Color.argb(255, newr>255?255:newr,newg>255?255:newg, newb>255?255:newb); pixs[i*width+j]=newColor; } } bitmap.setPixels(pixs, 0, width, 0, 0, width,height); return bitmap; } public staticBitmap gray(Bitmap bmp){ int width=bmp.getWidth(); int height=bmp.getHeight(); Bitmap bitmap=bmp.createBitmap(width, height,Bitmap.Config.RGB_565); Canvas canvas=new Canvas(bitmap);//创建一个画布 Paintpaint=new Paint();//创建一个画笔 float[] data={(float) 0.3,(float) 0.59,(float)0.11,0,0,(float) 0.3,(float) 0.59,(float) 0.11,0,0,(float) 0.3,(float)0.59,(float) 0.11,0,0,(float) 0.3,(float) 0.59,(float) 0.11,0,0};//灰度图的颜色过滤矩阵 ColorMatrix coma=new ColorMatrix(data);//以data为参数创建颜色过滤矩阵 ColorMatrixColorFilter filter=new ColorMatrixColorFilter(coma);//颜色过滤器 paint.setColorFilter(filter); canvas.drawBitmap(bmp, 0, 0, paint);/在绘制bitmap return bitmap; } for(inti=1;i<height-1;i++){ for(intj=1;j<width-1;j++){ count=0; newr=newg=newb=0; for(int m=-1;m<2;m++){//高斯模糊的算法,3*3矩阵,用的算子是算子是1/16{1,2,1,2,4,2,1,2,1},高斯模糊在模糊的同时有考虑每个像素的比重,所以边缘得以保留下来 for(int n=-1;n<2;n++){ pixColor=pixs[(i+m)*width+j+n]; r=Color.red(pixColor); g=Color.green(pixColor); b=Color.blue(pixColor); newr+=r*data[count];//3*3矩阵每一个像素分别相乘 newb+=b*data[count]; newg+=g*data[count]; count++; } } //temp=(int)sum; newr/=size;//除以16 newb/=size; newg/=size; newr=Math.min(255, Math.max(0, newr)); newg=Math.min(255, Math.max(0, newg)); newb=Math.min(255, Math.max(0, newb)); temp=Color.argb(255, newr, newg, newb); newpixs[i*width+j]=temp; for(inti=1;i<height-1;i++){ for(int j=1;j<width-1;j++){ temp=255; for(intm=-1;m<2;m++){ for(int n=-1;n<2;n++){//最小值滤波,3*3矩阵中的最小值 pixcolor=pixs[(i+m)*width+j+n]; temp=temp>=pixcolor?pixcolor:temp; } } newpixs[i*width+j]=temp; } } int[]Cdata=new int[width*height];//原像素 int[]fdata=new int[width*height];//反色的像素 int[]temp=new int[width*height]; bmp.getPixels(Cdata,0, width, 0, 0, width, height); for(inti=0;i<height;i++){ for(int j=0;j<width;j++){ pixColor=Cdata[i*width+j];//原像素 r=Color.red(pixColor); g=Color.green(pixColor); b=Color.blue(pixColor); nr=255-r;//变反 nb=255-b; ng=255-g; newColor=Color.argb(255, nr, ng, nb); fdata[i*width+j]=newColor; } } int minColor; inttempr,tempb,tempg; for(inti=1;i<height-1;i++){ for(int j=1;j<width-1;j++){ tempr=tempb=tempg=255; for(intm=-1;m<2;m++){ for(int n=-1;n<2;n++){ //反色像素用最小值滤波 pixColor=fdata[(i+m)*width+j+n]; r=Color.red(pixColor); g=Color.green(pixColor); b=Color.blue(pixColor); tempr=r>tempr?tempr:r; tempg=g>tempg?tempg:g; tempb=b>tempb?tempb:b; //反色像素用最小值滤波 } } pixColor=Cdata[i*width+j]; r=Color.red(pixColor); g=Color.green(pixColor); b=Color.blue(pixColor); //原图像与反色并且最小值滤波的图像图层叠加,用颜色减淡模式 tempr=(int) (r+r*tempr/(256-tempr)); endr=tempr>=255?255:tempr;//颜色减淡的模式,结果色=基色+基色*混合色/(255—混合色) 图层的叠加,以灰度图为基色,处理过的图层为混合色,结果色=基色+基色*混合色/(255-混合色),最终会使基色图朝变亮的方向发展,对比度增加。 tempg=(int)(g+g*tempg/(256-tempg)); endg=tempg>=255?255:tempg; tempb=(int)(b+b*tempb/(256-tempb)); endb=tempb>=255?255:tempb; minColor=Color.argb(255,endr, endg, endb); temp[i*width+j]=minColor; //min[Color=Color.argb(255,, green, blue) } }