如何通过转换为PNG从JPEG图像获取透明背景?

拉维

我想将图像(jpg / jpeg)的背景设​​为透明白色。

下面是将绿色背景转换为白色(正确识别人的边缘)的代码:输入图像输出图像

def change_bg(img, bg=(255, 255, 255)):
    # convert to hsv
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # threshold using inRange
    range1 = (20, 80, 80)
    range2 = (90, 255, 255)
    mask = cv2.inRange(hsv, range1, range2)
    mask = 255 - mask

    # apply morphology opening to mask
    kernel = np.ones((3, 3), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    # antialias mask
    mask = cv2.GaussianBlur(mask, (0, 0), sigmaX=3, sigmaY=3, borderType=cv2.BORDER_DEFAULT)
    mask = skimage.exposure.rescale_intensity(mask, in_range=(127.5, 255), out_range=(0, 255))

    result = img.copy()
    result[mask == 0] = bg
    return result

使用下面的代码,我将jpeg图像转换为png,但是我看到一些不透明的白色像素:结果图像

def white_to_transe(image):
    """
    @input: PIL image
    @return:
    """
    image = image.convert('RGBA')
    # Transparency
    newImage = []
    for item in image.getdata():
        if item[:3] == (255, 255, 255):
            newImage.append((255, 255, 255, 0))
        else:
            newImage.append(item)

    image.putdata(newImage)
    print(image.mode, image.size)
    return newImage

那么,如何获得干净的白色透明背景呢?

white_to_transe使用以下内容进行更新后,它可以工作,但是会影响白色像素,例如说白衬衫:

    for item in image.getdata():
        if item[0] > 240 and item[1] > 240 and item[2] > 240:
            newImage.append((255, 255, 255, 0))

是否有可能我们不添加白色(全部为255),而是在change_bg功能上添加了透明性?

汉斯·赫斯

您的方法可能有点不幸。在对遮罩进行抗锯齿时,您会得到范围内的值0 ... 255,但只能进行设置result[mask == 0] = bg(白色)。您无需考虑所有其他像素(逐渐地)也属于原始蒙版。因此,我将重新安排您的代码,并简单地将最终蒙版用作Alpha通道。我也是使用OpenCV做到的;从我的角度来看,使用附加的Pillow循环感觉有些麻烦。

那将是您的代码的修改摘录:

import cv2
import numpy as np
import skimage.exposure

img = cv2.imread('rmQRJIS.jpg')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower = (40, 80, 80)
upper = (90, 255, 255)
mask = cv2.inRange(img_hsv, lower, upper)
mask = 255 - mask

kernel = np.ones((3, 3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

# Use initial, binary mask to set background to white
result = img.copy()
result[mask == 0] = (255, 255, 255)

# Save image just for intermediate output
cv2.imwrite('output_no_trans.png', result)

# Use antialiased mask as final alpha channel for transparency
mask = cv2.GaussianBlur(mask, (0, 0), sigmaX=3, sigmaY=3, borderType=cv2.BORDER_DEFAULT)
mask = skimage.exposure.rescale_intensity(mask, in_range=(127.5, 255), out_range=(0, 255))
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask

# Save final image
cv2.imwrite('output.png', result)

作为中间输出,我将背景设置为白色后保存了图像:

中间输出

包括alpha通道的最终输出如下所示:

最终输出

老实说,在这里几乎看不到差异,因为我必须在上传之前缩小输出图像的尺寸以保持PNG兼容性。如果结果对您有利,请您自己查看完整图像!

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
NumPy:         1.20.1
OpenCV:        4.5.1
scikit-image:  0.18.1
----------------------------------------

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用javascript将图像从PNG转换为JPEG?

来自分类Dev

如何将.xcf文件/图像转换为JPEG或PNG?

来自分类Dev

如何使用javascript将图像从PNG转换为JPEG?

来自分类Dev

如何将.xcf文件/图像转换为JPEG或PNG?

来自分类Dev

转换为 PNG 时如何使 Vaadin 图表背景透明?

来自分类Dev

将pdf转换为图像[jpeg | png]

来自分类Dev

JPEG转换为透明PNG会导致黑色渗色

来自分类Dev

将png转换为jpeg(转换后的图像质量)

来自分类Dev

将png转换为jpeg(转换后的图像质量)

来自分类Dev

如何在不转换白色背景介绍透明度的情况下将PDF转换为PNG

来自分类Dev

如何在PNG图像中保持透明背景

来自分类Dev

如何将HTML转换为JPEG / PNG

来自分类Dev

如何在目标C中将PNG或JPEG转换为UIBezierPath

来自分类Dev

如何保持GraphicsMagick .ai到.png转换的透明背景?

来自分类Dev

XCODE 5 iOS7如何在不丢失透明背景的情况下将UIImage(PNG)转换为NSData

来自分类Dev

如何通过js将二进制代码的图像从api转换为png

来自分类Dev

如何通过Mac上的终端将PDF转换为一系列图像(JPG或PNG)?

来自分类Dev

Python 和 opencv:如何将此图像的所有背景转换为一种颜色或透明

来自分类Dev

如何在R中将JPEG转换为图像矩阵

来自分类Dev

如何使用R将TIFF图像转换为JPEG

来自分类Dev

如何在Swift中将图像转换为渐进JPEG?

来自分类Dev

SwiftUI:如何将图像转换为jpeg数据?

来自分类Dev

如何在R中将JPEG转换为图像矩阵

来自分类Dev

将具有透明度的png图像转换为jpg会破坏图像

来自分类Dev

如何将近似白色转换为透明背景

来自分类Dev

将SVG转换为PNG,并将应用的图像作为背景转换为SVG元素

来自分类Dev

集合视图中PNG图像的透明背景

来自分类Dev

在PNG图像中用白色替换透明背景

来自分类Dev

用于PNG图像的GTK Python透明背景

Related 相关文章

  1. 1

    如何使用javascript将图像从PNG转换为JPEG?

  2. 2

    如何将.xcf文件/图像转换为JPEG或PNG?

  3. 3

    如何使用javascript将图像从PNG转换为JPEG?

  4. 4

    如何将.xcf文件/图像转换为JPEG或PNG?

  5. 5

    转换为 PNG 时如何使 Vaadin 图表背景透明?

  6. 6

    将pdf转换为图像[jpeg | png]

  7. 7

    JPEG转换为透明PNG会导致黑色渗色

  8. 8

    将png转换为jpeg(转换后的图像质量)

  9. 9

    将png转换为jpeg(转换后的图像质量)

  10. 10

    如何在不转换白色背景介绍透明度的情况下将PDF转换为PNG

  11. 11

    如何在PNG图像中保持透明背景

  12. 12

    如何将HTML转换为JPEG / PNG

  13. 13

    如何在目标C中将PNG或JPEG转换为UIBezierPath

  14. 14

    如何保持GraphicsMagick .ai到.png转换的透明背景?

  15. 15

    XCODE 5 iOS7如何在不丢失透明背景的情况下将UIImage(PNG)转换为NSData

  16. 16

    如何通过js将二进制代码的图像从api转换为png

  17. 17

    如何通过Mac上的终端将PDF转换为一系列图像(JPG或PNG)?

  18. 18

    Python 和 opencv:如何将此图像的所有背景转换为一种颜色或透明

  19. 19

    如何在R中将JPEG转换为图像矩阵

  20. 20

    如何使用R将TIFF图像转换为JPEG

  21. 21

    如何在Swift中将图像转换为渐进JPEG?

  22. 22

    SwiftUI:如何将图像转换为jpeg数据?

  23. 23

    如何在R中将JPEG转换为图像矩阵

  24. 24

    将具有透明度的png图像转换为jpg会破坏图像

  25. 25

    如何将近似白色转换为透明背景

  26. 26

    将SVG转换为PNG,并将应用的图像作为背景转换为SVG元素

  27. 27

    集合视图中PNG图像的透明背景

  28. 28

    在PNG图像中用白色替换透明背景

  29. 29

    用于PNG图像的GTK Python透明背景

热门标签

归档