OpenCV中的图像基本操作--B站视频教程笔记(二)

在学习B站教学视频的时候记录的笔记

OpenCV+TensorFlow】迪哥带你做项目!深度学习+计算机视觉实战 纯实战教学 技能点加满


2.1 截图部分图像数据

首先读取一张图片,然后截取其中的一部分。比如,对角(0,0)(200,200)的矩形区域。由于img本身就是一个多维数组,也就是说可以看错数组进行操作,直接去img[0:200,0:200]而第3维全部都取即可。代码如图:

img = cv2.imread('H:\Peronal\cat.jpg')
cat = img[0:200,0:200]
cv_show('cat',cat)

效果如图:

2.2 颜色通道提取

需要注意的是,前面讲过opencv读取的通道顺序为BGR。代码如下:

b,g,r = cv2.split(img)

提取的结果为2维数组,仅仅表示b通道所有像素点的值。方便观察,输出b的内容已经b的尺寸。如图:

2.3 通道合并

相对应的通道可以合成,代码如下:

img= cv2.merge((b,g,r))

2.4 单通道

只保留某个通道,代码如下:

# 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)

cur_img[:,:,0]相当于与1,2维全要,3维只要序号为0的数据,也就是相当于BGR中的B通道,全部设置成0。这是numpy的多维数组操作。

效果如图:

以此类推,只保留G代码如下:

# 只保留G  呈现绿色
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('R',cur_img)
# 只保留B  呈现蓝色
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('R',cur_img)

2.5 边界填充

后续处理中,为了让待处理图像形状一直,需要对图像进行压缩或者放大。有时需要填充,填充可以采用以下方式代码如下:

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_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)
import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')
plt.show()

效果如图:

 ORIGINAL原始图像

BORDER_REPLICATE : 复制法,也就是复制最边缘像素

BORDER_REFLECT : 反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb

BORDER_REFLECT101 : 反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba

BORDER_WRAP : 外包装法cdefgh|abcdefgh|abcdefg

BORDER_CONSTANT : 常量法,常熟值填充。

2.6 数值

首先加载两张图像img_staff 为一张图线谱的图像。

img_cat = cv2.imread('H:\Peronal\cat.jpg')
img_staff = cv2.imread('H:\Peronal\staff1.jpg')

在img_cat图像上每一个点像素点都+10,代码如下:

img_cat2 = img_cata+10
img_cat[:5,:,0]

红色框选部分,原始图像值为244,处理后对应位置为254.但超过255的部分会如何处理呢,请看第一个位置原始数据为251,处理后结果为5可知,为261余除256后的结果。也就是超过256的部分保留。效果如图:

类似的操作还可以img_cat+img_cat2 结果如图:

另一个相加的方法cv2.add(img1,img2) 代码如图:

看结果发现与之前的+的方式不同的是,超过256的情况结果与+不同。切记。

2.7 图像融合

融合代码如下:

img_cat + img_staff

直接相加可能会出现错误,提示如下:

从提示中不难看出,由于两张图像的尺寸不一致所以无法直接融合。

为了顺利融合需要对图像进行处理,使之尺寸一致进而融合。这就需要使用resize操作。代码如下:

img_staff = cv2.resize(img_staff,(330,360))

resize处理后,图像尺寸都达到了330x360 如图:

reisze还有其他用法例如:

res = cv2.resize(img_cat,(0,0),fx=3,fy=1)

img_cat 待处理的图像对象

(0,0) 表示不指定具体的尺寸。那么后面的fx,fy会起作用

fx 为x轴方向的放缩倍数

fy 为y轴方向的放缩倍数

图像融合不是简单的相加,好像之前的img_cat+img_staff 而是需要使用cv2.addWeighted(img1 ,rate1 ,img2 ,rate2).代码如下:

res = cv2.addWeighted(img_cat,0.4,img_staff,0.6,0)

效果如下:

融合过程可以理解为,img_cat对应一点的数值val1 和img_staff对应点的数值val2 融合后图像对应点数值val3

val3 = val1 x 0.4 +val2 x 06

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值