在学习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