mafei863分享 http://blog.sciencenet.cn/u/mafei863 道法自然,道即合理

博文

J2ME图像处理基础编程

已有 3022 次阅读 2012-3-19 10:11 |个人分类:J2ME|系统分类:教学心得| 编程, 图像处理, J2ME

J2ME图像处理基础编程汇编如下,以便后续查找方便。大部分均来自网络启发思路,不敢独藏,拿来分享。
思路:程序将硬盘上的图像源文件读取到内存指定的区域中才能处理,对各像素点处理的关键是int类型的位移运算,特别是高位的alpha通道,不能破坏原有的值,所以,若要重新构造数据,则需要赋值全为1,即alpha=0xFF。新像素值p=((alpha<< 24) | (r<< 16) | (g<< 8) | b); 
很多稍微复杂些的工作,均有其对应的套路,整理如下。
步骤如下:
setp 1.硬盘上的图像源文件读取到内存句柄中
public Image LoadImage(String strImgPath){
  try{
   img=Image.createImage(strImgPath);//"/test.jpg"
  }catch(Exception ex){
   System.out.print("Error:"+ex.toString());
  }
  return img;
 }
setp 2.内存句柄散列到指定数组,以便处理方便
public int[] getPixels(Image img) 
      { 
          int w = img.getWidth(); 
          int h = img.getHeight(); 
          int[] pixels = new  int[w * h]; 
          img.getRGB(pixels, 0, w, 0, 0, w, h); 
          return pixels; 
      }
step 3.各种具体的图像处理算法实施 
   public Image imageToGray(Image src) { 
          int srcW = src.getWidth(); 
          int srcH = src.getHeight();  
          int[] srcPixels = getPixels(src); 
          int r = 0; 
          int g = 0; 
          int b = 0; 
          int a = 0; 
          int argb; 
          int temp; 

          for (int i = 0; i < srcH; i++) 
          { 
               for(int ii=0;ii<srcW;ii++) 
         { 
                   argb = srcPixels[i*srcW+ii]; 
                         a = ((argb & 0xff000000) >> 24); // alpha channel
                         r = ((argb & 0x00ff0000) >> 16); // red channel
                         g = ((argb & 0x0000ff00) >> 8); // green channel
                         b = (argb & 0x000000ff); // blue channel
                         temp = (int)(.299*(double)r+.587*(double)g+.114*(double)b); 
                        
                         r = temp; 
                         g = temp; 
                         b = temp; 
                         srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b); 
         } 
          } 
         return drawPixels(srcPixels, srcW, srcH);  
     }
step 4. 将处理后的数据数组中的像素值,还原为图像像素值RGB格式,以便显示等处理。
 public Image drawPixels(int[] pixels, int w, int h) 
     { 
         Image image = Image.createRGBImage(pixels, w, h, true); 
         pixels = null; 
         return image; 
     }
////////////////////////////////////////////////////////////////////////////////
5.Robert边缘检测,可以生成类似于素描图的样式
 public Image edgeDetectByRobert(Image src){
    int srcW = src.getWidth(); 
          int srcH = src.getHeight();  
          int[] srcPixels = getPixels(src); 
          int[] srcPixelsTemp = new int[srcW*srcH];
          int r = 0; 
          int g = 0; 
          int b = 0; 
          int a = 0; 
          int argb,p0,p1,p2,p3;  
          int temp=0xFF; 

          for (int i = 0; i < srcH-1; i++) 
          { 
               for(int ii=0;ii<srcW-1;ii++) 
                  { 
              
                       p0 = srcPixels[i*srcW+ii]; 
                     a = ((p0 & 0x00ff0000) >> 16);
                     p1=srcPixels[(i+1)*srcW+ii];
                       r = ((p1 & 0x00ff0000) >> 16);
                       p2 = srcPixels[i*srcW+ii+1]; 
                       g = ((p2 & 0x00ff0000) >> 16);
                       p3=srcPixels[(i+1)*srcW+ii+1];
                       b = ((p3 & 0x00ff0000) >> 16);
                     
                       argb=(int)Math.abs(a-b)+(int)Math.abs(r-g);//高位的alpha通道,不能破坏原有的值
                       srcPixelsTemp[i*srcW+ii]= ((temp << 24) | (argb << 16) | (argb << 8) | argb); 
                } 
          } 
         return drawPixels(srcPixelsTemp, srcW, srcH);
}
6. 灰度化(所谓的黑白照片样式)
public Image imageToGray(Image src) { 
          int srcW = src.getWidth(); 
          int srcH = src.getHeight();  
          int[] srcPixels = getPixels(src); 
          int r = 0; 
          int g = 0; 
          int b = 0; 
          int a = 0; 
          int argb; 
          int temp; 

          for (int i = 0; i < srcH; i++) 
          { 
               for(int ii=0;ii<srcW;ii++) 
         { 
                   argb = srcPixels[i*srcW+ii]; 
                         a = ((argb & 0xff000000) >> 24); // alpha channel
                         r = ((argb & 0x00ff0000) >> 16); // red channel
                         g = ((argb & 0x0000ff00) >> 8); // green channel
                         b = (argb & 0x000000ff); // blue channel
                         temp = (int)(.299*(double)r+.587*(double)g+.114*(double)b); 
                        
                         r = temp; 
                         g = temp; 
                         b = temp; 
                         srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b); 
         } 
          } 
         return drawPixels(srcPixels, srcW, srcH);  
     }
////////////////////////////////////////////////////////////////////////////////
7. 边缘分割,可以生成类似于简笔画图的样式,需要先做二值化
 public Image edgeDetectBy4Neighborhood(Image src){
    int srcW = src.getWidth(); 
          int srcH = src.getHeight();  
          int[] srcPixels = getPixels(src); 
          int[] srcPixelsTemp = new int[srcW*srcH];
          int b = 0; 
          int c = 0; 
          int d = 0; 
          int e = 0,a=0; 
          int argb,p0,p1,p2,p3,p4;  
          int temp=0xFF; 

          for (int i = 1; i < srcH-1; i++) 
          { 
               for(int ii=1;ii<srcW-1;ii++) 
                  { 
              
                       p0 = srcPixels[i*srcW+ii]; 
                     a = ((p0 & 0x00ff0000) >> 16);
                     p1=srcPixels[(i-1)*srcW+ii];
                       b = ((p1 & 0x00ff0000) >> 16);
                       p2 = srcPixels[i*srcW+ii+1]; 
                       c = ((p2 & 0x00ff0000) >> 16);
                       p3=srcPixels[(i+1)*srcW+ii];
                       d = ((p3 & 0x00ff0000) >> 16);
                       p4=srcPixels[(i)*srcW+ii-1];
                       e = ((p4 & 0x00ff0000) >> 16);
                       //对二值化后的图像进行类似于简笔画的生成
                      if(a==0&&(b==255||c==255||d==255||e==255)) 
                        argb=0;
                      else
                       argb=255;
                     
                       srcPixelsTemp[i*srcW+ii]= ((temp << 24) | (argb << 16) | (argb << 8) | argb); 
                } 
          } 
         return drawPixels(srcPixelsTemp, srcW, srcH); 
          
   }


https://wap.sciencenet.cn/blog-538909-549253.html

上一篇:EI----Academy Publisher 期刊简介
下一篇:J2ME中System.out.print与System.out.println的区别
收藏 IP: 125.46.3.*| 热度|

1 陈小斌

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-30 06:58

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部