在位图上反转黑白不起作用

Inverting black and white on a bitmap is not working

我用 OpenCV 做了一些图像处理。我想反转这个位图(黑到白,白到黑),但我遇到了一些问题。

这样做后我得到了这个位图:

// to grey
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY, 4);

Imgproc.adaptiveThreshold(mat, mat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);

Utils.matToBitmap(mat, bitmapCopy);

这是反转后的结果。

这是我的代码:

    // to grey
    Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY, 4);

    Imgproc.adaptiveThreshold(mat, mat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);

    Utils.matToBitmap(mat, bitmapCopy);

    for(int y = 0; y < bitmapCopy.getHeight(); y++){
        for(int x = 0; x < bitmapCopy.getWidth(); x++){

            int pixel = bitmapCopy.getPixel(x,y);

            if (pixel == Color.WHITE){
                bitmapCopy.setPixel(x, y, Color.BLACK);
            } else {
                bitmapCopy.setPixel(x, y, Color.WHITE);
            }
        }
    }

第一个图像中的白线应该反转为黑线,但它不起作用。我用 Adob​​e Photoshop 检查了文件。当我指向图像的白色区域时,它显示颜色为白色 (#FFFFFF)。

我错过了什么?有没有大神能指教一下?

您输入的是灰度图像。所以只有纯白色会变成黑色,其他都是白色。

我不熟悉 opencv,所以这可能行不通。但值得一试。

int invertedPixel = (0xFFFFFF - pixel) | 0xFF000000;
bitmapCopy.setPixel(x,y, invertedPixel);

您可以使用 bitwise-not 来反转图像。通常,您希望避免遍历每个像素,因为它非常慢。

原创

结果

这里有两种反转图像的方法。使用内置的 cv2.bitwise_not() 函数或仅减去 255。它在 Python 中实现,但同样的想法可以在 Java.

中使用
import cv2

image = cv2.imread('1.png')
result = 255 - image
alternative_result = cv2.bitwise_not(image)

cv2.imshow('image', image)
cv2.imshow('result', result)
cv2.imshow('alternative_result', alternative_result)
cv2.waitKey(0)