img = cv2.imread(filepath)
img = cv2.imread('img.jpg')
img = cv2.imread(filepath + 'img.jpg')
img = cv2.imread(filepath +'out/img.jpg')
img1 = img[100:150,200:300]
cv2.imwrite(savepath , img1)#cv2.imwrite(保存到的地方 , 被保存对象)
cv2.imwrite('img1.jpg' , img1)
根据提示,在右侧编辑器补充 Begin-End 代码,实现图片的读取、保存以及兴趣窗口截取的操作。具体要求如下:
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 ##########
图像:M×N×C
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)
可以得到如下图所示的绿色通道图像:
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)
根据提示,在右侧编辑器补充 Begin-End 代码,实现图像通道分离与合并操作。具体要求如下:
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 ##########
1.图片边界填充
对于卷积操作,最边缘的像素需要先进行图片边缘填充,再卷积
img1 = copyMakeBorder(src, dst, top, bottom, left, right, borderType, value)
1.src:原图像;
2.dst: 目标图像;
3.top, bottom, left, right: 上下左右扩充的长度;
4.borderType: 填充的类型。OpenCV 填充的类型有:
5.value: 常数填充时的颜色值,填充的类型是常量型边界该值才有意义。
代码:
replicate = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_REPLICATE)
2.获取图片典型属性
image 对象时有以下典型属性:
读取图片后执行以下代码:
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)
代码:
img_cat_resize = cv2.resize(img_cat, (550, 366))
②用cv2.addWeighted函数实现图像融合
img2 = cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype)
代码:
res = cv2.addWeighted(img_apple_resize, 0.5, img_pear_resize, 0.5, 0)
在右侧编辑器补充 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路径下保存融合的图片。
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 ##########
有问题欢迎指出!