【问题标题】:OpenCV - Turn Transparent Part of PNG whiteOpenCV - 将PNG的透明部分变为白色
【发布时间】:2018-07-26 18:26:33
【问题描述】:

我是 OpenCV 的新手,所以如果我的问题对你来说很愚蠢,请多多包涵。

我有一组图像,它们的左右两侧都有透明边框,如下所示:

我想擦除这些边框,所以我想到了边缘检测,如果我可以将这些透明边框转换为白色,这将很容易做到。在文档中我发现你可以这样做:

img = cv2.imread("./Green/image-000.png", 1)
cv2.imwrite('../image-000.png', img)

这会擦除 png 图像的 Alpha 通道,但会将其变为黑色。 是否有类似的东西使边框变白? 或者有没有更简单的方法来擦除这些边界? 如果你能帮助我,你会让我很开心!

PS:我使用 Python 2.7 和 OpenCV 3.4

【问题讨论】:

  • 为什么将它们“擦除”为黑色或白色?如果不需要,为什么不完全剪掉它们?
  • 边框大小因图片而异,因此我无法输入特定值进行裁剪。也许我想得太复杂了
  • 你说它们是透明的——所以你知道它们在哪里——它们就是图像透明的地方。
  • 不知道图片在哪里透明。我怎样才能知道呢?
  • 打印出第一行像素。它们按 BGRA 顺序排列,因此第一个像素的透明度将是第 4 个值,第二个像素的透明度将是第 8 个值。您将看到像素不再透明的阶跃变化。

标签: python image opencv png


【解决方案1】:

您应该使用-1 加载图像,即IMREAD_UNCHANGED,即

img = cv2.imread("./Green/imgage-000.png", cv2.IMREAD_UNCHANGED)

那么,你的图片就会有4个通道(BGRA),你可以使用alpha通道遮罩将对应的部分变成白色:

alpha_channel = img[:, :, 3]
_, mask = cv.threshold(alpha_channel, 254, 255, cv.THRESH_BINARY)  # binarize mask
color = img[:, :, :3]
new_img = cv.bitwise_not(cv.bitwise_not(color, mask=mask))

我用一个透明的 PNG 测试了这段代码,其中颜色通道是黑色的,信息是透明的:

嵌套的bitwise_not 很难看,但这是我发现使它工作的唯一方法。

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 2018-07-18
    • 2015-09-05
    • 2014-08-09
    • 2019-05-12
    • 2015-03-18
    • 2016-06-23
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多