python - 在opencv中将png保存为jpg时出现问题
问题描述
我正在运行这段代码并得到错误的结果:
#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 通道并不会移除背景,因为 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)
推荐阅读
- java - Java:将特定单词替换为其他内容不变
- linux - 在 shell 脚本中调用多个命令
- machine-learning - 我应该为 PCA 选择多少个主成分?
- node.js - NodeJS中如何同步调用异步代码
- date - 编辑 DATE 字段的部分以组成日期值
- ios - Apple Pay 支付的 PayFort paymentAPI“缺少参数”
- javascript - 将 three.js 背景更改为不透明度 0.5
- windbg - 如何通过 WinDBG 在 Dump 中查找非托管内存中的内容
- android - Dagger 2:如何从 FragmentFactory 的子组件绑定父组件中的 Fragment Map
- jenkins-pipeline - Jenkins管道在条件下验证文件是否以特定格式存在