Opencv关于PNG图像的load和save问题

本文介绍如何使用OpenCV正确加载并处理带有透明通道的PNG图像,包括调整cvLoadImage函数参数以保留透明度信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Opencv作为开源的免费软件,bug和功能上都有问题(可以用Intel的ipp来代替)

比如png带透明度的文件,查资料说,Opencv不支持png的第4个通道,即透明度通道。

有的说要修改opencv里png解码函数然后重新编译实现对透明通道的支持,但这方法很麻烦,ios、android、windows下都要重新编译。

抱着试试的想法,实验了一下,貌似解决了问题:

1、cvloadimage载入png文件时,默认的第2个参数是1,即CV_LOAD_IMAGE_COLOR,生成的iplimage对象的channel数是3,而不是4,丢失了第4通道。需要改为cvloadimage(pbuf,-1)得到的iplimage对象就是4个channel;

2、opencv的cvshowimage函数,显示对应的iplimage对象还是错误的,可以忽略不管丫的。

3、在对生成的iplimage对象处理时,记得要处理第4个通道的数据,比如得到每个像素点的cvscalar对象a,要对a.val[3]数据进行处理!

4、保存时,可以直接使用cvsaveimage函数保存为png文件,不需要考虑第三个参数的设置。

### 使用 OpenCV 实现透明图像合成 在处理图像时,有时需要将两个带有透明度通道(Alpha 通道)的图像合成为一个新图像。这可以通过调整像素的颜色不透明度来完成。对于每一对对应的像素,计算它们颜色分量的新值,并根据各自的 Alpha 值决定最终显示效果。 为了实现这一操作,在 Python 中可以利用 NumPy 库配合 OpenCV 来访问修改图像数据中的 RGBA 信息。下面是一个简单的例子说明如何加载两张 PNG 格式的图片(假设都含有 alpha 通道),并将它们叠加在一起形成一个新的合成图像: ```python import cv2 import numpy as np def blend_transparent(face_img, overlay_t_img): # Split out the transparency mask from the colour info overlay_img = overlay_t_img[:,:,:3] # Grab the RGB layers only overlay_mask = overlay_t_img[:,:,3:] # And the alpha layer of the second image # Again calculate the inverse mask background_mask = 255 - overlay_mask # Turn the masks into three channel, so we can use them as weights overlay_mask = cv2.cvtColor(overlay_mask, cv2.COLOR_GRAY2BGR) background_mask = cv2.cvtColor(background_mask, cv2.COLOR_GRAY2BGR) # Create a masked output image, reducing the opacity of non-masked areas face_part = (face_img * (1.0 / 255.0)) * (background_mask * (1.0 / 255.0)) overlay_part = (overlay_img * (1.0 / 255.0)) * (overlay_mask * (1.0 / 255.0)) # Combine the images and convert back to uint8 data type return np.uint8(cv2.addWeighted(face_part, 255.0, overlay_part, 255.0, 0.0)) # Load two transparent png files by adding an extra parameter 'cv2.IMREAD_UNCHANGED' img1 = cv2.imread('image_with_alpha_1.png', cv2.IMREAD_UNCHANGED) img2 = cv2.imread('image_with_alpha_2.png', cv2.IMREAD_UNCHANGED) resultant_image = blend_transparent(img1, img2) # Save or display resultant image here... ``` 上述代码展示了如何读入含alpha通道的PNG文件[^3],并通过适当的比例混合两幅图像的颜色成分,从而创建出新的合成图像。注意这里使用 `cv2.IMREAD_UNCHANGED` 参数确保了原始图像的数据不会被改变,特别是保留了alpha通道的信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值