Android上的卷积过滤器无法正常工作

时间:2014-01-06 10:50:15

标签: java android image editing convolution

我无法让Android的卷积滤镜正常运行。结果图像与应用某些蒙版后的图像相差甚远。无论选择何种滤波器,结果图像都会包含大量噪声,并且看起来不应该如此。这是我的卷积滤镜类:

import android.graphics.Bitmap;
import android.graphics.Color;

public class ConvolutionFilter {

    public Bitmap apply_Mask(int[] mask, Bitmap image) {
        int c;
        Bitmap preview;
        preview=image;

         int r=0;
         int g=0;
         int b=0;

         int weight=0;
         int weightSum=0;
         int counter=0;

         for (int i = 0; i < mask.length; i++)
         {
             weightSum += (int)mask[i];
         }

         for (int i = 0; i < (image.getWidth()-1); i++)
         {
             for (int j = 0; j < (image.getHeight()-1); j++)
             {
                 r = g = b = 0;
                 counter = 0;

                  for (int o = i - 1; o <= i + 1; o++)
                 {
                     for (int p = j - 1; p <= j + 1; p++)
                     {
                         if ((o == -1 && (p == -1 || p == image.getHeight())) || (o == image.getWidth() && (p == -1 || p == image.getHeight())))
                             c = image.getPixel(i, j);
                         else if (o == -1 || o == image.getWidth())
                             c = image.getPixel(i, p);
                         else if (p == -1 || p == image.getHeight())
                             c = image.getPixel(o, j);
                         else
                             c = image.getPixel(o, p);

                         weight = (int)mask[counter];

                         r += ( Color.red(c)* weight);
                         b += (Color.blue(c) * weight);
                         g += (Color.green(c) * weight);

                         counter++;
                     }
                 }
                 if (weightSum == 0)
                     weightSum = 1;
                 r = r / weightSum;
                 b = b / weightSum;
                 g = g / weightSum;

                 if (r < 0)
                     r = 0;
                 if (r > 255)
                     r = 255;

                 if (b < 0)
                     b = 0;
                 if (b > 255)
                     b = 255;

                 if (g < 0)
                     g = 0;
                 if (g > 255)
                     g = 255;



                 preview.setPixel(i, j, Color.rgb(r, g, b));


             }

         }
         return preview;
    }
}

以下是我如何使用它:

laplacian.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            Intent intent=getIntent();
            final Uri uri=intent.getParcelableExtra("imageUri");



            int[] laplacian = { 
                    0, -1, 0, 
                    -1, 4, -1, 
                    0, -1, 0 };
            String str=new String("Trwa przetwarzanie...");
            Toast.makeText(FiltersMenu.this, str , Toast.LENGTH_SHORT).show();
            Intent intent1=new Intent(FiltersMenu.this,DisplayingProcessedImage.class);
            intent1.putExtra("filtr", laplacian);
            intent1.putExtra("imageUri", uri);
            startActivity(intent1);

        }
    });

最后,我在这里显示已编辑的图像,但结果与我的预期不同:

public class DisplayingProcessedImage extends Activity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_displaying_processed_image);
    Intent intent=getIntent();
    Uri uri=intent.getParcelableExtra("imageUri");
    int[] filtr=intent.getIntArrayExtra("filtr");
    String str=uri.toString();
    Bitmap bitmap=BitmapFactory.decodeFile(str);

    Bitmap bitmap2 = bitmap.copy(bitmap.getConfig(), true);






    ConvolutionFilter filter=new ConvolutionFilter();

    ImageView imgView;
    imgView = (ImageView) findViewById(R.id.image);
    imgView.setImageBitmap(filter.apply_Mask(filtr, bitmap2));

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.displaying_processed_image, menu);
    return true;
}

任何想法我可能做错了什么?我一直得到“Skipped xxx frames!应用程序可能在其主线程上做了太多工作”的消息。这是否意味着它跳过像素的某些计算?

问题已解决:正如有人在不同论坛上指出的那样,我正在对已修改的位图进行计算:

preview=image;

添加:

Bitmap preview=Bitmap.createBitmap(image);

解决了这个问题。

0 个答案:

没有答案