Opencv-图像基本操作(读取,融合,边界填充等)
程序员文章站
2024-03-21 23:32:46
...
Opencv 图像基本操作
此操作都在pycharm中完成,代码博主演示通过。
import cv2
import matplotlib.pyplot as plt
- 读取图像并显示:
img = cv2.imread('xx.png')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
此处 我将xx.png(图片)直接放在 F:\PycharmProjects 目录下也就是我电脑pycharm的文件存储目录。
- 图像属性读取
print(img.shape)
print(img.size)
var = type(img)
print(var)
打印出:
(512, 512, 3)
786432
<class ‘numpy.ndarray’>
- 颜色通道分离,0 1 2 分别对应(B G R)
cur_img = img.copy()
cur_img[:, :, 1] = 0
cur_img[:, :, 2] = 0
cv2.imshow('B', cur_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
此示例分离出 G R两个通道,保留了B (blue)通道,所以图像显示出是蓝色调;
cur_img[:, :, 1] = 0
其中[:, :, 1] 解释为,前部分 :, :, 选取该图像G通道的所有像素点
- 边界填充
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT101)
cv2.imshow('replicate', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
此处用到了opencv滤波算法中的 copyMakeBorder() 函数和 borderInterpolate()函数;原理:扩充原图的边缘,将图像变大,然后以各种外插方式自动填充图像边界
边界填充有多种方法:
- BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh #复制法
- BORDER_REFLECT: fedcba|abcdefgh|hgfedcb #对称法
- BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
- BORDER_WRAP: cdefgh|abcdefgh|abcdefg #用另外一边边缘像素来填充
- BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified ‘i’ #常量法
后面的 aaaaaa|abcdefgh|hhhhhhh 意思是 复制最边界像素的值;
- 图像融合 (先转化成大小一样的图片再融合)
var1 = img.shape
print(var1)
var2 = img1.shape
print(var2)
img = cv2.resize(img, (512, 512)) # 注意此处的参数(500, 512)中的500对应原图片的第二个480
print(img.shape)
res = cv2.addWeighted(img, 0.4, img1, 0.6, 0) # 0.4, 0.6为两张照片的权重,0为偏置项 方程为:Qx1 + Px2 + b| Q,P为权重
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
值得注意的是 使用resize()函数时 输入的参数对应原图像是相反的
此处img的原始大小为 (480 480 3) 需要转变和img1 相同大小 (512 512 3)
定义两张照片的融合权重后,打印输出。