OpenCV图像识别实战 第二节 opencv-python基本编程(1)

先找个图像基础看一看,几分钟就行了,知道计算机下图像是什么样的。不然问我为什么要用数字,用矩阵...我真回答不上来

这里的代码实现的环境 python 版本3.6.3,  opencv-python版本3.4.1.15

仅供参考

目录

1.引包

2.读取图像

3.显示图像

4.打印图像矩阵

5.保存图像

6.颜色通道B,R,G获取

7.边界填充

8.opencv视频读取与处理

9.ROI区域

10.数值计算

1.引包(如果没有,则代表你的anaconda环境里没有,请下载到anaconda环境,或者切换anaconda环境)

import cv2
import numpy as np
import matplotlib.pyplot as plt #这一条是用matplotlib,如果没有可不输入,matplotlib是图像处理的插件,还是比较好用的,推荐装到环境中

2.读取图像(我的图像命名是girl1.jpg)

彩色图像的读取

# 读取图像(如果图片是在计算机内,而没有放在python项目中,path是你的电脑存储图像的路径)
path = 'C:/Users/13758/Pictures/test/'
img = cv2.imread(path + "girl1.jpg")
#读取图像(如果图像放在python下)
img = cv2.imread("girl1.jpg")

灰度图像的读取 

#读取灰度图
img = cv2.imread("girl1.jpg",cv2.IMREAD_GRAYSCALE)

3.显示图像

# 下面两行是opencv 显示
cv2.imshow('girl1',img)
cv2.waitKey(1000)   #cv2.waitkey()表示图片滞留时间,若括号内为0,则按任意键结束放映,若为1000,则1000毫秒后自动结束放映
# 下面是三行matplotlib 显示
plt.imshow(img)
plt.axis('off')
plt.show()
若运行上面三行则可以发现图像变蓝,OpenCV读取图片(cv2.imread())后,图像的颜色通道顺序是[B, G, R],和matplotlib读取图片(plt.imread())后,图像的颜色通道顺继续[R, G, B]恰好是相反的。这时,我们要想让图片正常显示,需要进行通道交换。
img = img[:,:,(2,1,0)] # 交换B和R通道 matplotlib显示图像
plt.imshow(img)
plt.axis('off')
plt.show()

4.打印图像矩阵

# 下面2行为读取图像数据矩阵
pixel_data = np.array(img)
print(pixel_data)

print(img.shape) #打印宽度,高度,通道数
print(img.size)  #打印图像像素大小
print(img.dtype) #打印数据类型

5.保存图像

saveFile = "C:/Users/13758/Pictures/test/girl2.jpg"
cv2.imwrite(saveFile,img)

使用函数cv2.imwrite(file,img,num)保存一个图像。第一个参数是要保存的文件名,第二个参数是要保存的图像。可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3. 

6.颜色通道B,R,G获取

#颜色通道提取
# 分离 b,r,g通道
b,r,g = cv2.split(img)
print(r) #打印r通道
print(r.shape)
# 整合 b,r,g通道
img = cv2.merge((b,g,r))
print(img.shape)

#只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv2.imshow('R',cur_img)
cv2.waitKey(1000)

#只保留G
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv2.imshow('G',cur_img)
cv2.waitKey(1000)

#只保留R
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv2.imshow('B',cur_img)
cv2.waitKey(1000)

7.边界填充 (会在特征提取中用到)

简单理解就是把图像四周的扩大,那扩大后的区域拿什么来填充的问题

一般就是下面5种扩充的方式

#BORDER_REPLICATE:复制法,也就是复制最边缘像素。 #BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb #BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba #BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg #BORDER_CONSTANT:常量法,常数值填充,需要在函数中填入常数参数。

复制法的代码实现

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)
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
cv2.imshow('replicate',replicate)
cv2.waitKey(0)

其它几种方法实现的代码差不多,下面附上,你也可以改成用opencv查看,这里用的是plt查看

# 填充的范围
#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,cv2.BORDER_REFLECT)
#reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
#wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
#constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
# 展示填充效果
#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('REFLECT_101')
#plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
#plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

#plt.show()

各种效果图就像下面这样

OpenCV图像识别实战 第二节 opencv-python基本编程(1)_第1张图片

 8.opencv视频读取与处理(我的视频叫test1)

#vc = cv2.VideoCapture("C:/Users/13758/Pictures/test/test1.mp4") #(如果视频在计算机内,自己指定路径)
vc = cv2.VideoCapture('test1.mp4') #(如果视频在python中)
#检查是否打开正确
if vc.isOpened():
    oepn, frame = vc.read()  #oepn为返回值,读取第一帧 oepn的值为True或者False ,frame为当前图像
else:
    open = False

while open: #只要能打开,遍历每一帧
       ret, frame = vc.read()  #读取
       if frame is None:
           break     #如果图像为空,跳出来
       if ret == True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #这里我转为黑白图像查看(灰度图像)
            cv2.imshow('result', gray)    #展示结果
            if cv2.waitKey(60) & 0xFF == 27:  #waitkey() 类似于帧率 0xff == 27 表示退出快捷键退出
                break
vc.release()
cv2.destroyWindow()  #销毁窗口,如果不销毁,关闭的时候就会卡一下

这里可能会有疑问?为什么图像的处理代码那么简单,视频这么麻烦?

可以看出这是个循环语句。因为视频是图像连起来形成的,所以处理视频的方式就是一帧一帧图像处理,所以处理完这一张继续处理下一张,这就形成了我们的视频处理,所以要循环,通俗易懂吧,好好揣摩一下。

9.ROI区域 region of intrest(截取图像特定区域)

就是截图!你感兴趣的区域截取出来。

img=cv2.imread("girl1.jpg")
girl=img[600:800,800:900]
cv2.imshow('girl1',girl)
cv2.waitKey(0)

 第二行意思就是你要截取第几个像素点到第几个像素点,长和宽各取一次。

10.数值计算

这里我的图片一张叫girl1,另一张叫cat1

打印下图片矩阵,观察下图像矩阵

arraycat = np.array(img_cat)
print(arraycat)
arraygirl =  np.array(img_girl)
print(arraygirl)

+法的运算(这里只打印前五行,查看下结果)

# +法
img_cat2 = arraycat + 10
print(img_cat2[:5,:,0]) #打印前5行
print(arraycat[:5,:,0])

两张图片的+法

# +法(2) 超过256相当于% 256
img_cat3 = img_cat2 + arraycat
print(img_cat3[:5,:,0])

add法的运算

# add法 超过255就是最大255
img_cat4 = cv2.add(img_cat2,arraycat)
print(img_cat4)

add法与+法的区别就是如果图像的像素点值超过最大值255的处理,+法会取余数,而add法直接截至255(像素的值不会超过255)

图像融合(两张相同shape的图才能互相融合,记得改shape)

#图像融合
#shape值一样才能融合 用resize使得图像shape一样
img_cat = cv2.resize(img_cat,(2400,1600))
img_girl = cv2.resize(img_girl,(2400,1600))
res = cv2.addWeighted(img_cat,0.4,img_girl,0.6,0) #这里你可以看成加权操作
cv2.imshow('res',res)
cv2.waitKey(3000)

图像融合起来就是这样的效果

如图,有点像重影的感觉

OpenCV图像识别实战 第二节 opencv-python基本编程(1)_第2张图片

这章先这样,都是很基础的操作,

自己实现一下,很简单的,过一遍就会了。

后面会附上代码包。

(82条消息) opencv-python学习代码-Python文档类资源-CSDN文库

你可能感兴趣的:(OpenCV图像识别,opencv,python,计算机视觉)