【问题标题】:Problem when saving a png to jpg in opencv在opencv中将png保存为jpg时出现问题
【发布时间】:2019-08-10 04:06:06
【问题描述】:

我正在运行这段代码并得到错误的结果:

        #saving image into a white bg
        img = cv2.imread(dir_img + id, cv2.IMREAD_UNCHANGED)
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
        print(img.shape)
        cv2.imwrite(dir_img + id, img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

原始文件是具有透明背景的 png。我不知道为什么,但是瓶颈后面的灰色图案很省钱。

原始文件:

【问题讨论】:

  • 可以分享原始文件吗?
  • 可能是因为您的图像背后有灰色图案,但它被 Alpha 通道“隐藏”了
  • @Alderven 原始文件上传
  • @Miki 如何删除它?

标签: python python-3.x opencv png


【解决方案1】:

如 cmets 中所述,在这种情况下,仅移除 alpha 通道并不会移除背景,因为 BGR 通道具有您要移除的伪影,如下所示,当您仅绘制 B、G 或 R 通道时.

你的 alpha 通道看起来像这样

要实现您的需要,您需要应用一些矩阵数学来获得结果。我在这里附上了代码

import cv2
import matplotlib.pyplot as plt

img_path = r"path/to/image"

#saving image into a white bg
img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
plt.imshow(img)
plt.show()
b,g,r, a = cv2.split(img)
print(img.shape)

new_img  = cv2.merge((b, g, r))
not_a = cv2.bitwise_not(a)
not_a = cv2.cvtColor(not_a, cv2.COLOR_GRAY2BGR)
plt.imshow(not_a)
plt.show()
new_img = cv2.bitwise_and(new_img,new_img,mask = a)
new_img = cv2.add(new_img, not_a)

cv2.imwrite(output_dir, new_img)
plt.imshow(new_img)
print(new_img.shape)
plt.show()

结果是尺寸为(1200, 1200, 3)的图像

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2011-05-12
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多