头歌-基本的图像操作

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

任务描述
本关任务:掌握基于 Python-OpenCV 的基本读取和保存图片操作。

相关知识
大多数的计算机视觉应用项目需要将图像作为输入,同时也会将图像作为输出结果。因此掌握基本的图像读取保存操作十分重要。

为了完成本关任务,你需要掌握:

图片的读取与保存;
兴趣窗口的选取。

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

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

import numpy as np
import cv2

def _log():  # 将函数名修改为 _log
    filepath = '/data/workspace/myshixun/task5/'

    # 读取图像
    img = cv2.imread(filepath + 'shanfeng.png')

    ########## Begin ##########
    # 1. 灰度转换
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 2. 边缘扩充处理图像并使用高斯滤波处理该图像
    # 使用BORDER_REPLICATE模式扩展图像边缘
    image = cv2.copyMakeBorder(gray_img, 2, 2, 2, 2, borderType=cv2.BORDER_REPLICATE)
    # 使用高斯滤波,核大小为5x5
    image = cv2.GaussianBlur(image, (5, 5), 0)

    # 3. 使用Numpy定义LoG算子
    log_kernel = np.array([[ 0,  0, -1,  0,  0],
                           [ 0, -1, -2, -1,  0],
                           [-1, -2, 16, -2, -1],
                           [ 0, -1, -2, -1,  0],
                           [ 0,  0, -1,  0,  0]])

    # 4. 卷积运算
    # 使用卷积进行边缘检测
    image1 = cv2.filter2D(image, cv2.CV_16S, log_kernel)

    # 5. 数据格式转换
    image1 = cv2.convertScaleAbs(image1)

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

    # 保存处理后的图像
    cv2.imwrite(filepath + "out/log.png", image1)

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

任务描述
本关任务:理解图像通道的概念,掌握基于 Python-OpenCV 的图像通道分离与合并操作。

相关知识
通道是图像处理的基本概念,它决定图像如何存储与显示。 RGB 颜色模式下图像具有 R, G, B 三个颜色通道。

为了完成本关任务,你需要掌握:

分离图片通道;
合并图片通道。
图片的通道分离与合并
对于一幅的数字图像,我们看到的是一幅真正的图片,但是对于计算机,这副图像只是一个数字矩阵。

计算机存储的数字图像的本质是一个多维矩阵。一副尺寸为M × N 的图像可以用一个 M × N × c的矩阵来表示,矩阵元素(M, N)的值表示这个位置上的像素的亮度,c表示的就是通道数。

描述一个像素点,如果用灰度描述它,就是单通道,即c=1。光学三原色(红、绿、蓝,  RGB )能够组成任何的颜色,如果c=3,说明图片在RGB颜色模式,每一个三原色都是一个通道。

 注意:

图像通道仅仅在显示的时候才有意义;
卷积神经网络里面的通道是指卷积核个数,与本任务讨论的通道不同。

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

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

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 ##########
    # 分离BGR通道
    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 ##########
    # 合并通道,保留红色通道,绿色和蓝色通道设置为0
    color_r = cv2.merge([b*0, g*0, r])
    
    # 保存合并后的图像
    cv2.imwrite(filepath + 'out/color_r.png', color_r)
    ########## End ##########

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

任务描述
本关任务:掌握基于 Python-OpenCV 的边界填充与图像融合操作。

相关知识
为了完成本关任务,你需要掌握:

图像的边界填充;
图片融合。
图片的边界填充
对于卷积操作,最边缘的像素一般无法处理,因为卷积核中心到不了最边缘像素。这时需要先将图片边界填充,再进行卷积操作,最后将扩充的边界去掉,则原图像每个像素都进行了卷积。

编程要求
在右侧编辑器补充 Begin-End 代码,完成 step 1 和 step 2 的任务,实现图片的填充与图像融合操作。
step 1. 补全padding()函数,实现图像填充操作。具体要求如下:

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

读取filepath路径下的cat.jpg, dog.jpg;
resize重置两个读取的图像为相同大小(550, 366);
融合两张读取的图像,其中cat的权值为0.3,dog的权值为0.7,gamma值为0;
在savepath路径下保存融合的图片。

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

def padding():
    filepath = "/data/workspace/myshixun/task3/"
    
    # 读取图像
    img = cv2.imread(filepath + "six.png")
    
    # 更改通道顺序(BGR 转 RGB)
    img = img[:, :, (2, 1, 0)]

    # 定义边界填充的长度
    top = bottom = left = right = 30

    ########## Begin ##########
    # 1. 使用不同的填充方式
    replicate = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
    reflect = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
    reflect101 = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REFLECT_101)
    wrap = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_WRAP)
    constant = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(0, 0, 0))

    ########## End ##########
    
    # 绘制图像并保存
    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"
    
    # 读取图像
    img_cat = cv2.imread(filepath + "cat.jpg")
    img_dog = cv2.imread(filepath + "dog.jpg")
    
    # 重新调整图像大小,使它们相同
    img_cat_resized = cv2.resize(img_cat, (550, 366))
    img_dog_resized = cv2.resize(img_dog, (550, 366))
    
    # 融合两张图像,cat 的权值为 0.3,dog 的权值为 0.7,gamma 为 0
    fusion_img = cv2.addWeighted(img_cat_resized, 0.7, img_dog_resized, 0.3, 0)

    # 保存融合后的图像
    cv2.imwrite(savepath, fusion_img)

这里是答案给错了,正常来说应该是fusion_img = cv2.addWeighted(img_cat_resized, 0.3, img_dog_resized, 0.7, 0)

代码仅供参考自学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值