Python+opencv处理图片

keyword: opencv、抠图、贴图、缩放、透明背景

1、读取图片

img_jpg = cv2.imread('bg.png',cv2.IMREAD_UNCHANGED)
# img_bgr1 = cv2.imread(img_path) # 默认读取方式,读取BGR彩色图像,忽略Alpha通道

cv2.IMREAD_UNCHANGED表示保留通道,这里的png文件是4通道的。

2、缩放

dst = cv2.resize(src,dsize,fx,fy,interpolation)
dst2 = cv2.resize(img, (400, 400))  # 按照宽400像素、高400像素的大小进行缩放
# 参数说明如下
# src 原始图像
# dsize 输出图像的大小 格式为宽高
# fx 可选参数 水平方向的缩放比例
# fy 可选参数 垂直方向的缩放比例
# interpolation 可选参数 缩放的插值方式
# dst 缩值之后的图像

比例缩放这样使用:

bg_png = cv2.resize(bg_png, None, fx=0.7, fy=0.7)

3、翻转

dst=cv2.flip(src,flipcode)
# flipcode为反转类型
# 0为沿X轴翻转,正数为沿Y轴翻转,负数为同时沿X轴、Y轴翻转

沿X轴是上下翻转,沿Y轴是左右翻转

4、给jpg图像加第四通道

叠加的时候通道数必须一样,不然会报错。如果背景是3通道的,需要先扩充通道如下:

import cv2 
import numpy as np
 
def add_alpha_channel(img):
    """ 为jpg图像添加alpha通道 """
 
    b_channel, g_channel, r_channel = cv2.split(img) # 剥离jpg图像通道
    alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255 # 创建Alpha通道
 
    img_new = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) # 融合通道
    return img_new

5、 叠加透明底图片

def merge_img(bg_img, fg_img, y1, y2, x1, x2):
    """
    将png透明背景图像与背景图像叠加
    y1,y2,x1,x2为叠加位置坐标值
    """
    yy1 = 0
    yy2 = fg_img.shape[0]
    xx1 = 0
    xx2 = fg_img.shape[1]

    # 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
    alpha_png = fg_img[yy1:yy2, xx1:xx2, 3] / 255.0
    alpha_jpg = 1 - alpha_png

    # 开始叠加
    for c in range(0, 3):
        bg_img[y1:y2, x1:x2, c] = ((alpha_jpg * bg_img[y1:y2, x1:x2, c]) + (alpha_png * fg_img[yy1:yy2, xx1:xx2, c]))

    return bg_img

6、处理整个文件夹下的图片

folder = './fgr_adult'

for filename in os.listdir(folder):
	file_path = os.path.join(folder,filename)
	bg_png = cv2.imread(file_path,cv2.IMREAD_UNCHANGED)

    # 保存结果图像
    cv2.imwrite('./out_adult/' + filename, bg_img)

整个主函数这样:

if __name__ == '__main__':

    # 读取背景图像
    img_jpg = cv2.imread('bg.png',cv2.IMREAD_UNCHANGED)

    folder = './fgr_adult'

    for filename in os.listdir(folder):

        fg_img = cv2.imread('bg.png', cv2.IMREAD_UNCHANGED) # 保留
        file_path = os.path.join(folder,filename)
        bg_png = cv2.imread(file_path,cv2.IMREAD_UNCHANGED)

        bg_png = cv2.resize(bg_png, None, fx=0.7, fy=0.7)

        # 设置叠加位置坐标
        x1 = 400 #水平位置
        y1 = 0
        x2 = x1 + bg_png.shape[1]
        y2 = y1 + bg_png.shape[0]

        # 开始叠加
        res_img = merge_img(fg_img, bg_png, y1, y2, x1, x2)

        # 保存结果图像
        cv2.imwrite('./out_adult/'+filename, res_img)

7、图片转视频

img2video.py

import cv2
import os

im_dir = './out_adult' #图片路径
video_dir = 'video1.avi' #输出视频路径

fps = 30 #帧率
num = 263 #图片数

img_size = (1024,1024) #图片尺寸

#fourcc = cv2.cv.CV_FOURCC('M','J','P','G')#opencv2.4
fourcc = cv2.VideoWriter_fourcc('M','J','P','G') #opencv3.0
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)

for filename in os.listdir(im_dir):
    file_path = os.path.join(im_dir,filename)
    frame = cv2.imread(file_path, cv2.IMREAD_UNCHANGED)
    videoWriter.write(frame)
    print(file_path)

videoWriter.release()

8、问题

imshow用不了,离谱

	cv2.imshow("res",res_img)
    # 定义程序退出方式:鼠标点击显示图像的窗口后,按ESC键即可退出程序
    if cv2.waitKey(0) & 0xFF == 27:
        cv2.destroyAllWindows()
报错:cv2.error: OpenCV(4.6.0) C:\b\abs_f8n1j3l9l0\croot\opencv-suite_1691622637237\work\modules\highgui\src\window.cpp:1267: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

我发现可能是我没有正确安装opencv,因为网络原因无法用pip或conda install opencv-python。码一下python离线安装包方法:https://blog.youkuaiyun.com/weixin_46726459/article/details/133817228

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值