如何将一张图片转换成纹身?

4
我正在为Tattoolater应用程序工作,需要将从相机拍摄或从图库选择的图像转换为纹身...
我的要求如下:
我在GitHub上找到了示例代码https://github.com/DrewDahlman/ImageFilter/tree/master/Android/project。
这是用于图像过滤的代码。
我不知道这是否是将图像转换为纹身的正确流程。
如果有人知道如何在Android中实现这个纹身,请建议并提供帮助,我已经搜索了很多资料,谢谢!

无用的观察:这张图片是来自 iPhone? - Anup Cowkur
边缘检测 - Vladimir Mironov
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);

如何计算位图的水平差和垂直差? - Santosh
抱歉,在安卓系统中无法工作,位图只能转换为byte[]矩阵而不能转换为byte[][]矩阵,此外这里的image.x和image.y未被识别...您能否给出清晰的解释? - Santosh
代码已经编辑完毕,应该更容易实现了。 - Exceptyon
那么如何将最终结果设置为图像的转换位图呢?你将值存储在布尔变量中,但它在bitmap.setpixels()方法中无法被识别。 - Santosh
在这一行出现了运行时错误(IllegalStateException):bm.setPixel(x, y, result[y*width+x]? Color.BLACK : Color.WHITE); - Santosh
显示剩余5条评论

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;
    }

我用了你的代码,将我的位图传递给ConvertToBlackAndWhite()方法后,它显示为白色图像。 - Santosh
在 doBlackWhiteImage() 函数中,您正在检查具有白色、透明、黑色和其他默认颜色白色的像素(如何检查其余颜色),所以我认为这就是问题所在......请问您能解决这个问题吗? - Santosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接