2017-06-05 17:31:48 tdong000 阅读数 487

Android图像处理——浮雕效果

浮雕效果原理:

对图像像素点的像素值与相邻像素点的值相减后加127.

核心代码:

/**
 * 浮雕效果
 * @param bitmap
 * @return
 */
public static Bitmap handleEmbossEffect(Bitmap bitmap) {
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int color = 0, preColor = 0, a, r, g, b;
    int r1, g1, b1;
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

    int[] oldPx = new int[width * height];
    int[] newPx = new int[width * height];
    bitmap.getPixels(oldPx, 0, width, 0, 0, width, height);
    for (int i = 1; i < oldPx.length; i++) {
        preColor = oldPx[i-1];
        a = Color.alpha(preColor);
        r = Color.red(preColor);
        g = Color.green(preColor);
        b = Color.blue(preColor);

        color = oldPx[i];
        r1 = Color.red(color);
        g1 = Color.green(color);
        b1 = Color.blue(color);

        r = r1 - r + 127;
        g = g1 - g + 127;
        b = b1 - b + 127;

        if (r > 255) {
            r = 255;
        } else if (r < 0){
            r = 0;
        }

        if (g > 255) {
            g = 255;
        } else if (g < 0){
            g = 0;
        }

        if (b > 255) {
            b = 255;
        } else if (b < 0){
            b = 0;
        }
        newPx[i] = Color.argb(a, r, g, b);
    }
    bmp.setPixels(newPx, 0, width, 0, 0, width, height);
    return bmp;
}

效果如下图所示:

原图:

原图

效果图:

Emboss

2015-10-17 13:27:30 u011669081 阅读数 1879

接上之前的数字图像处理软件系列,其实这个APP很早之前就做完了,主要是模仿了美图秀秀。之前因为太多事而耽误了,现在继续把这系列的博客写完

     那么开始正文:

     这次要讲的图片特效部分是:浮雕特效

     老规矩,话不多说,我们来看效果图:

                                                               

那么下面就开始讲解:

浮雕的特性我们必须得知道,浮雕不凸显细节但是凸显轮廓,这是浮雕的特性,那么轮廓有哪些特点呢?我个人认为,图片中的事物,他们的轮廓区分,基本可以靠颜色区分,也就是边界的颜色差异,当然这个方法只是可以突出局部的轮廓,但这也足够用了。所以和前几篇一样,我们需要用RGB操作,即比较RGB(凸显边界)


 //浮雕
    public static Bitmap  img_fudiao(Bitmap  bm){
    
 
 int width = bm.getWidth();    
int height = bm.getHeight();
 Bitmap  bmp= Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 


 
 int color,color2;  
     //前一个像素  
    int pixelsR,pixelsR2;  
    int pixelsG,pixelsG2;  
    int pixelsB,pixelsB2;  
     //当前像素  
    
 
 
int[] pixels = new int[width * height];
bm.getPixels(pixels, 0, width, 0, 0, width, height);
 
for(int i=1;i<width*height;i++)
{
  color = pixels[i-1];  
               //前一个像素  
               pixelsR = Color.red(color);  
               pixelsG = Color.green(color);  
               pixelsB = Color.blue(color);  
               //当前像素  
               color2 = pixels[i];  
               pixelsR2 = Color.red(color2);  
               pixelsG2 = Color.green(color2);  
               pixelsB2 = Color.blue(color2);  
                 
               pixelsR = (pixelsR - pixelsR2 + 127);  
               pixelsG = (pixelsG - pixelsG2 + 127);  
               pixelsB = (pixelsB - pixelsB2 + 127);  
               //均小于等于255  
               if(pixelsR > 255){  
                   pixelsR = 255;  
               }  
                 
               if(pixelsG > 255){  
                   pixelsG = 255;  
               }  
                 
               if(pixelsB > 255){  
                   pixelsB = 255;  
               }  
               pixels[i] = Color.argb(255, pixelsR, pixelsG, pixelsB);
}  
 
bmp.setPixels(pixels, 0, width, 0, 0, width, height);
   
    return bmp;
    }

 在代码中可以看到,每次去相邻两项的RGB,让他们做比较,差异色大的可以基本确定是边界色,也就可以凸显轮廓

最后返回结果。


2018-11-15 00:26:08 sdfsdfytre 阅读数 28

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                这篇将讲到图片特效处理的浮雕效果。跟前面一样是对像素点进行处理,算法是通用的。

算法原理:用前一个像素点的RGB值分别减去当前像素点的RGB值并加上127作为当前像素点的RGB值。

例:

ABC

求B点的浮雕效果如下:

B.r = C.r - B.r + 127;

B.g = C.g - B.g + 127;

B.b = C.b - B.b + 127;

注意RGB值在0~255之间。

效果图:



                     原图                                                                              效果图



package com.color;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.widget.ImageView;public class ColorView extends ImageView private Paint myPaint = nullprivate Bitmap bitmap = nullprivate int width,height; private int[] oldPixels;      private int[] newPixels;      private int color,color2;    private int pixelsR,pixelsG,pixelsB,pixelsA,pixelsR2,pixelsG2,pixelsB2;     public ColorView(Context context, AttributeSet attrs) {  super(context, attrs);  bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ww);   width = bitmap.getWidth();          height = bitmap.getHeight();        oldPixels = new int[width*height];         newPixels = new int[width*height];        invalidate(); } @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);         //获取像素        bitmap.getPixels(oldPixels, 0, width, 0, 0, width, height);                for(int i = 1;i < height*width; i++){          color = oldPixels[i-1];          //前一个像素          pixelsR = Color.red(color);          pixelsG = Color.green(color);          pixelsB = Color.blue(color);          //当前像素          color2 = oldPixels[i];          pixelsR2 = Color.red(color2);          pixelsG2 = Color.green(color2);          pixelsB2 = Color.blue(color2);                    pixelsR = (pixelsR - pixelsR2 + 127);          pixelsG = (pixelsG - pixelsG2 + 127);          pixelsB = (pixelsB - pixelsB2 + 127);          //均小于等于255          if(pixelsR > 255){           pixelsR = 255;          }                    if(pixelsG > 255){           pixelsG = 255;          }                    if(pixelsB > 255){           pixelsB = 255;          }                    newPixels[i] = Color.argb(pixelsA, pixelsR, pixelsG, pixelsB);                  }        bitmap.setPixels(newPixels, 0, width, 0, 0, width, height);  canvas.drawBitmap(bitmap,0,0,myPaint); }}


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述
2011-02-07 08:52:00 jasperu 阅读数 292

对图像的浮雕处理。。

2011278:51:39

 

     /// <summary>

         /// 应用程序的主入口点。

         /// </summary>

         [STAThread]

         static void Main()

         {

              Application.Run(new Form1());

         }

        

         Bitmap bmp;

         private void button1_Click(object sender, System.EventArgs e)

         {

              if(this.openFileDialog1.ShowDialog()==DialogResult.OK)

              {

                bmp = new Bitmap(this.openFileDialog1.FileName);

 

 

                ///---  这里是渲染浮雕的过程

                for (int i = 0; i < bmp.Width - 1; i++)

                {

                    for (int j = 0; j < bmp.Height - 1; j++)

                    {

                        Color Color1 = bmp.GetPixel(i, j);

                        Color Color2 = bmp.GetPixel(i + 1, j + 1);

                        int red = Math.Abs(Color1.R - Color2.R + 128);

                        int green = Math.Abs(Color1.G - Color2.G + 128);

                        int blue = Math.Abs(Color1.B - Color2.B + 128);

                        //颜色处理

                        if (red > 255) red = 255;

                        if (red < 0) red = 0;

 

                        if (green > 255) green = 255;

                        if (green < 0) green = 0;

 

                        if (blue > 255) blue = 255;

                        if (blue < 0) blue = 0;

                        bmp.SetPixel(i, j, Color.FromArgb(red, green, blue));

                        // 表示在指定的委托进行相应色的改变

                    }

                }

                   this.pictureBox1.Image=bmp;

              }

            this.pictureBox1.Image.Save("D://bmp2.bmp");

         }

 

         private void Form1_Load(object sender, System.EventArgs e)

         {

              this.pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;

         }

        /// <summary>

        ///  move的时候了获取的是鼠标移动到某个点的原色信息

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

        {

         

 

 

            if (this.pictureBox1.Image != null)

            {

                Bitmap bmp = (Bitmap)this.pictureBox1.Image;

 

                 /// 这里获取的是我们的委托对象中的某个颜色的值的信息

                try

                {

                    Color pixelColor = bmp.GetPixel(e.X, e.Y);

                    this.Text = "(" + pixelColor.R.ToString() + "," +

                                pixelColor.G.ToString() + "," + pixelColor.B.ToString() + ")";

                }

                catch {}

            }         

        }

 

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

        {

           

           

        }

    }

}

2013-07-12 11:44:51 u011326233 阅读数 930

将图片中像素的点与相邻点的rgb值进行相减,然后加上128,得到中间值灰色

因为相邻点基本上都是rgb比较相似的,所以相似的点的处理结果基本上临近128,而不相近颜色的值则偏离128较远,所以可以得到一个类似于浮雕的图像。

在处理的结果的r/g/b三个值通常不是相同的,所以需要再进行一次灰度算法来将图像转换为灰度图,最终变成一个灰度浮雕图像。


参考http://www.icodelogic.com/?p=575

没有更多推荐了,返回首页