4

我正在为纹身后的应用程序工作,因为我需要将图像(从相机拍摄或从画廊中选择)转换为纹身......

我的要求如下

在此处输入图像描述 我从 github 找到了一个示例代码 https://github.com/DrewDahlman/ImageFilter/tree/master/Android/project

它用于图像过滤..

我不知道将图像转换为纹身的正确过程是否正确

如果有人知道这个纹身在 android 请建议我我用谷歌搜索了很多

提前致谢..

4

2 回答 2

2

你需要一个差分过滤器:

1)你计算水平差异(这里你会有垂直段)

2)你计算垂直差(这里是水平段)

3)你或两张地图,找到轮廓

4)重新创建一个位图对象,如果你想这样做

类似(已编辑):

int[] pixels;
int width = yourbitmap.getWidth();
int height = yourbitmap.getHeight();
yourbitmap.getPixels(pixels, 0, width, 0, 0, width, height);

// transform grayscale
int[] image = new int[width*height];
for (int y=0; y<height; y++)
    for (int x=0; x<width; x++)
    {
        int pixel = image[y*width + x];
        image[y*width + x] = (Color.red(pixel) + Color.green(pixel) + Color.blue(pixel))/3;
    }

// calculate diff_x (vertical segments)
int[] dx = new int[width*height];

for (int y=0; y<height; y++)
    for (int x=0; x<width; x++)
        dx[y*width + x] = (x==0 || y== 0 ? 0 : Math.abs(image[y*width + x] - image[y*width + x-1]));

// calculate diff_y (horizontal segments)
int[] dy = new int[width*height];

for (int y=0; y<height; y++)
    for (int x=0; x<width; x++)
        dy[y*width + x] = (x==0 || y== 0 ? 0 : Math.abs(image[y*width+x] - image[(y-1)*width+x])); 


// when the color intensity is higher than THRESHOLD, accept segment
// you'll want a slider to change THRESHOLD values
bool[] result = new bool[width*height];
const int THRESHOLD = 60; // adjust this value

for (int y=0; y<height; y++)
    for (int x=0; x<width; x++)
        result[y*width + x] = (dx[y*width + x] > THRESHOLD || dy[y*width + x] > THRESHOLD);

Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for (int y=0; y<height; y++)
    for (int x=0; x<width; x++)
               result.setPixel(x, y, result[y*width+x]? Color.Black : Color.White);
于 2013-03-25T08:55:51.577 回答
0

你可以使用这个:

 public static Bitmap ConvertToBlackAndWhite(Bitmap sampleBitmap) {
        ColorMatrix bwMatrix = new ColorMatrix();
        bwMatrix.setSaturation(0);
        final ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(
                bwMatrix);
        Bitmap rBitmap = sampleBitmap.copy(Bitmap.Config.ARGB_8888, true);
        Paint paint = new Paint();
        paint.setColorFilter(colorFilter);
        Canvas myCanvas = new Canvas(rBitmap);
        myCanvas.drawBitmap(rBitmap, 0, 0, paint);
        return doBlackWhiteImage(rBitmap);
    }

public static BlackWhiteImage doBlackWhiteImage(Bitmap myBitmap) {
        int[] allpixels = new int[myBitmap.getHeight() * myBitmap.getWidth()];
        myBitmap.getPixels(allpixels, 0, myBitmap.getWidth(), 0, 0,
                myBitmap.getWidth(), myBitmap.getHeight());
        for (int i = 0; i < myBitmap.getHeight() * myBitmap.getWidth(); i++) {
            if (allpixels[i] == Color.BLACK)
                // do something
            else if (allpixels[i] == Color.TRANSPARENT)
                // do something
            else if (allpixels[i] == Color.WHITE)
                // do something
            else {
                allpixels[i] = Color.WHITE;
            }
        }
        myBitmap.setPixels(allpixels, 0, myBitmap.getWidth(), 0, 0,
                myBitmap.getWidth(), myBitmap.getHeight());
        return myBitmap;
    }
于 2013-03-25T08:58:44.437 回答