计算机视觉算法与OpenCV实践之基本图像操作

基本图像操作

  • 第1关:图片的基本读取和保存操作
    • 1.相关知识
    • 2.编程要求
    • 3.代码实现
  • 第2关:图像通道分离与合并操作
    • 1.相关知识
    • 2.编程要求
    • 3.代码实现
  • 第3关:边界填充与图像融合
    • 1.相关知识
    • 2.编程要求
    • 3.代码实现

第1关:图片的基本读取和保存操作

1.相关知识

  1. 图片读取
img = cv2.imread(filepath)
img = cv2.imread('img.jpg')
img = cv2.imread(filepath + 'img.jpg')
img = cv2.imread(filepath +'out/img.jpg')
  1. 兴趣窗口截取(截图)
img1 = img[100:150,200:300]
  1. 图片显示
cv2.imwrite(savepath , img1)#cv2.imwrite(保存到的地方 , 被保存对象)
cv2.imwrite('img1.jpg' , img1)

2.编程要求

根据提示,在右侧编辑器补充 Begin-End 代码,实现图片的读取、保存以及兴趣窗口截取的操作。具体要求如下:

  1. 读取给定路径下的图片。
  2. 图片兴趣区域截取。将要求 1 读取的图片,截取[100:150,200:300]的兴趣区域,并保存成cap.png。

3.代码实现

import cv2
def Gen():
    filepath = '/data/workspace/myshixun/task1/cat.jpg'
    # 读取给定路径filepath的图片cat.jpg
    ########## Begin ##########
    img = cv2.imread(filepath)

    ########## End ##########

    # 读取感兴趣窗口[100:150,200:300]并保存为指定路径savepath
    savepath='/data/workspace/myshixun/task1/out/cap.png'
    ########## Begin ##########
    img2 = img[100:150,200:300]
    cv2.imwrite(savepath , img2)
    
    ########## End ##########

第2关:图像通道分离与合并操作

1.相关知识

图像:M×N×C

  1. M,N:像素亮度
  2. C:通道数
    • C=1:单通道
    • C=3:三通道(R,G,B)

1.将三原色三通道分开,得到的是 B,G,R 单独通道的灰度图

B,G,R = cv2.split(img)

2.使其它两个通道的“亮度”为 0,分离显示单独颜色
三个维度:
0→B
1→G
2→R
eg.显示绿色通道

import cv2
img = cv2.imread('flower.jpg')
#展示彩色图片
cv2.imshow('flower.jpg', img)
#将蓝红置0
img[:, :, 0] = 0
img[:, :, 2] = 0
cv2.imshow('flower_g.jpg', img)
cv2.waitKey(0)

可以得到如下图所示的绿色通道图像:
计算机视觉算法与OpenCV实践之基本图像操作_第1张图片
3.合并通道
注意:((B,G,R))此处是双括号

img2 = cv2.merge((B,G,R))

4.(综合)分离通道并显示单独颜色图

import cv2

img = cv2.imread('flower.jpg')
cv2.imshow('flower.jpg', img)
#将三原色三通道分离,得到的是 B,G,R 单独通道的灰度图
B,G,R = cv2.split(img)
cv2.imwrite('b.png',B)
cv2.imwrite('g.png',G)
cv2.imwrite('r.png',R)
#展示分离图
img1 = cv2.imread('b.png')
cv2.imshow('b.png', img1)
img1 = cv2.imread('g.png')
cv2.imshow('g.png', img1)
img1 = cv2.imread('r.png')
cv2.imshow('r.png', img1)
#显示单独颜色图
#红色
img2 = cv2.merge((B,G,R))
img2[:,:,0] = 0
img2[:,:,1] = 0
cv2.imshow('flower_g.jpg', img2)#(此处图片名字应为'flower_r.png')
cv2.waitKey(0)

计算机视觉算法与OpenCV实践之基本图像操作_第2张图片

2.编程要求

根据提示,在右侧编辑器补充 Begin-End 代码,实现图像通道分离与合并操作。具体要求如下:

  1. 对于已经读取的图片变量img,分离它的R、G、B三个通道,并将三个通道按提示的指定路径保存成图片;
  2. 合并上一步中分离的三个通道,并按提示的指定路径保存R通道的彩色图像。

3.代码实现

import cv2

# 实现图像颜色通道分离和保存
def task2():
    filepath = "/data/workspace/myshixun/task2/"
    img = cv2.imread( filepath + 'pic.jpg')
    
    # 请分离图像的B,G,R通道,并保存到给定filepath下的out文件夹,
    # 三个通道分别保存为r.png、g.png、b.png
    ########## Begin ##########
    B,G,R = cv2.split(img)
    cv2.imwrite(filepath+'out/b.png',B)
    cv2.imwrite(filepath+'out/g.png',G)
    cv2.imwrite(filepath+'out/r.png',R)
    ########## End ##########
    
    # 请合并分离的通道,并在out文件夹下保存红色通道的彩色图像color_r.png
    ########## Begin ##########
    img1 = cv2.merge((B,G,R))
    img1[:,:,0] = 0
    img1[:,:,1] = 0
    cv2.imwrite(filepath+'out/color_r.png',img1)
    ########## End ##########

第3关:边界填充与图像融合

1.相关知识

1.图片边界填充
对于卷积操作,最边缘的像素需要先进行图片边缘填充,再卷积

img1 = copyMakeBorder(src, dst, top, bottom, left, right, borderType, value)

1.src:原图像;
2.dst: 目标图像;
3.top, bottom, left, right: 上下左右扩充的长度;
4.borderType: 填充的类型。OpenCV 填充的类型有:

  • BORDER_DEFAULT:将最近的像素进行复制填充;
  • BORDER_REPLICATE:复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度;
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。我们使用字母为例,左右复制abcdefgh靠近边缘的 6
    个字母: fedcba | abcdefgh | hgfedc;
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称复制。同样的,使用字母为例:gfedcba | abcdefg| gfedcba;
  • BORDER_WRAP:外包装法。相当于截断复制: cdefgh | abcdefgh | abcdefg;
  • BORDER_CONSTANT:常量法,常数值填充。

5.value: 常数填充时的颜色值,填充的类型是常量型边界该值才有意义。

代码:

replicate = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_REPLICATE)

2.获取图片典型属性
image 对象时有以下典型属性:

  • shape: 返回图像的[宽度, 长度, 通道数]的数组,如果是灰度图,返回值仅有行数和列数;
  • size: 返回图像的像素;
  • dtype: 返回图像的数据类型。

读取图片后执行以下代码:

img = cv2.imread('flower.jpg')
print("长度:", img.shape[1], "宽度:", img.shape[0], "通道:", img.shape[2], "像素:", img.size, "数据类型:", img.dtype)
print(img.shape)

输出结果:

长度: 310 宽度: 232 通道: 3 像素: 215760 数据类型: uint8
(232, 310, 3)

3.图片融合
!!注意:融合前提是两张图片尺寸一致,类型相同

①重置图片大小

img1 = cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)

  • InputArray src:输入图片地址
  • OutputArray dst:输出图片地址
  • Size:输出图片尺寸
  • fx, fy:沿x轴,y轴的缩放系数
  • interpolation:插入方式

代码:

img_cat_resize = cv2.resize(img_cat, (550, 366))  

②用cv2.addWeighted函数实现图像融合

img2 = cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype)

  • src1: 输入图片 1 的地址
  • alpha:输入图片 1 的像素权值
  • src2: 输入图片 2 的地址
  • beta:输入图片 2 的像素权值
  • gamma:图 1 与图 2 加和后的偏置量
  • dtype: 输出数组的可选深度。当两个输入数组的深度相同时,可以将dtype设置为-1,这等效于src1.depth()
  • dst:输出图片

代码:

res = cv2.addWeighted(img_apple_resize, 0.5, img_pear_resize, 0.5, 0)

2.编程要求

在右侧编辑器补充 Begin-End 代码,完成 step 1 和 step 2 的任务,实现图片的填充与图像融合操作。

step 1. 补全padding()函数,实现图像填充操作。具体要求如下:
1.读取图片filepath文件夹下的six.png;
2.定义上下左右扩充的长度为30;
3.根据本节教程所学,更换通道顺序;
4.参考本节给出的示例,请分别完成填充类型: replicate、reflect、reflect101、wrap、constant (value值为0)并以这些类型名来命名填充后的图像变量。

step 2. 根据代码提示要求,补全img_fusion()函数,实现图像融合。具体要求如下:
1.读取filepath路径下的cat.jpg, dog.jpg;
2.resize重置两个读取的图像为相同大小(550, 366);
融合两张读取的图像,其中cat的权值为0.3,dog的权值为0.7,gamma值为0;
3.在savepath路径下保存融合的图片。

3.代码实现

import cv2
import warnings
import matplotlib.cbook
warnings.filterwarnings("ignore",category=matplotlib.cbook.mplDeprecation)

def padding():
    filepath = "/data/workspace/myshixun/task3/"
    # 请按照step1的要求完成图像填充操作
    ########## Begin ##########
    img = cv2.imread(filepath+'six.png')
    img = img[:,:,(2,1,0)]
    replicate = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_REPLICATE) 
    reflect = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_REFLECT) 
    reflect101 = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_REFLECT_101) 
    wrap = cv2.copyMakeBorder(img, 30, 30, 30, 30,borderType=cv2.BORDER_WRAP) 
    constant = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_CONSTANT) 
    
    ########## End ##########
    
    # 绘制图像并保存
    import matplotlib.pyplot as plt
    plt.subplot(231), plt.imshow(img), plt.title('ORIGINAL')
    plt.subplot(232), plt.imshow(replicate), plt.title('REPLICATE')
    plt.subplot(233), plt.imshow(reflect), plt.title('REFLECT')
    plt.subplot(234), plt.imshow(reflect101), plt.title('REFLECT_101')
    plt.subplot(235), plt.imshow(wrap), plt.title('WRAP')
    plt.subplot(236), plt.imshow(constant), plt.title('CONSTANT')
    plt.savefig(filepath + "out/padding.png")

def fusion():
    filepath = "/data/workspace/myshixun/task3/"
    savepath = "/data/workspace/myshixun/task3/out/fusion.png"
    
    # 请按照step1的要求完成图像融合操作。
    ########## Begin ##########
    img_cat = cv2.imread(filepath+'cat.jpg')
    img_dog = cv2.imread(filepath+'dog.jpg')
    img_cat_resize = cv2.resize(img_cat, (550, 366))  
    img_dog_resize = cv2.resize(img_dog, (550, 366))  
    img_com = cv2.addWeighted(img_cat_resize ,0.7, img_dog_resize,0.3,0)
    cv2.imwrite(savepath,img_com)
    ########## End ##########

输出结果
计算机视觉算法与OpenCV实践之基本图像操作_第3张图片
计算机视觉算法与OpenCV实践之基本图像操作_第4张图片

有问题欢迎指出!

你可能感兴趣的:(计算机视觉,计算机视觉,opencv,算法,python)