OpenCV的学习
前言
经过大一上学期的学习,初步掌握了C语言,了解了一些相关编程语法,不过也算了刚刚入门而已,接触到OpenCV是有关于我寒假实验的一个考核。开始了解过后,发现是有关机器学习方面正好契合我好奇于人工智能领域的发展,现将一些学习心得及笔记记录于此,算是一个记录,也好翻看复习,本是想先看视频然后跟着实践,但自觉效率低下,于是自己倒腾,上CSDN看同行者的博文,一边学习一边体悟,操作与理论并行。欢迎广大学习爱好者一同学习分享,如有错误抑或是另种思路,欢迎留言讨论~
OpenCV与Python
OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C++、Java、python、cuda等的使用接口、机器学习的基础算法调用,基于现在大火的python,想要一探究竟,于是一边学习python一边学习OpenCV。
一、图片操作
1.1自定义展示图片
代码如图
import cv2
img = cv2.imread(r"pic.jpg") # 生成图片
cv2.namedWindow("Image") #创建一个窗口
cv2.imshow("before", img) #展示原图
img2 = img[50:200, 100:400]#可选择展示的区域,x,y
cv2.imshow("after", img2) # 展示选择区域图
print (img.shape) #可打印图片的尺寸
print(img.size) #可打印图片的像素
print (img2.shape)
print(img2.size)
cv2.waitKey() # 等待图片的关闭
cv2.destroyAllWindows()
运行效果
值得说明的是括号里的数字分别代表了什么
这是用了shape函数,shape返回的是图像的行数,列数,色彩通道数。
易错的地方:
行数其实对应于坐标轴上的y,即表示的是图像的高度
列数对应于坐标轴上的x,即表示的是图像的宽度
也就是说shape返回的是(高度, 宽度) = (y , x)
所以这里的意思是566高,550宽,色彩通道数为3
为直观看到,我将改变后的图片进行保存
cv2.imwrite('after.jpg',img2)
然后点击详细信息
嗯确实是300*516
1.2颜色通道
接下来一个问题便是,颜色通道,这玩意对于初学的我来说,之前根本不知道是什么概念,翻书以及参照其他人的博客,算了解了一下。
简单来说,一张彩色照片的组成可由三原色组成,即RGB,RED、GREEN、BULE。
R为一个红色通道,表示为1;
G为一个绿色通道,表示为2;
B 为一个蓝色通道,表示为3;
有一处白色图像则为4,它是由1、2、3处的通道颜色混合而成,这相当于我们使用的调色板,几种颜色混合在一起将产生一种新的颜色,我们用一串代码便可将其提取出来:
import cv2
img = cv2.imread('pic.jpg')
b, g, r = cv2.split(img)
print(b)
print(g)
print(r)
如图
这样看数字没有直观感觉,所以,我运用到图片上,还拿上面的夏目为例
上代码:
import cv2
img = cv2.imread(r"pic.jpg")#将其通道分开
b, g, r = cv2.split(img)
img1 = cv2.merge((b, g, r))#!!!opencv里面颜色是bgr
cv2.imshow('pic', img1)
cop_img = img1.copy()
cop_img[:,:,0] = 0
cop_img[:,:,1] = 0
cv2.imshow('only_red', cop_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
改动一个数字即可
cv2.imshow('pic', img1)
cop_img = img1.copy()
cop_img[:,:,0] = 0
cop_img[:,:,2] = 0
cv2.imshow('only_green', cop_img)
cv2.imshow('pic', img1)
cop_img = img1.copy()
cop_img[:,:,1] = 0
cop_img[:,:,2] = 0
cv2.imshow('only_blue', cop_img)
总之记住:H x W x C(高度 x 宽度 x 通道)
1.3灰度处理
import cv2
img = cv2.imread(r"pic.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#或者直接img_gray = cv2.imread(r"pic.jpg", 0)
cv2.imshow("gray", img_gray) # 展示灰度处理后的图
cv2.waitKey() # 等待图片的关闭
cv2.destroyAllWindows()
1.4保存图像
保存图像很简单,直接用cv2.imwrite即可。
cv2.imwrite("D:\\cat2.jpg", img)
cv2.imwrite(r"pic.jpg", img)
第一个参数是保存的路径及文件名
第二个是图像矩阵
第三个参数针对特定的格式,如下:
cv2.imwrite(r"pic.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 5])
cv2.imwrite(r"pic.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95。
!!!注意:cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int。
下面是以不同质量存储的两幅图:
对于PNG,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越高,图像尺寸越小。默认级别为3:
cv2.imwrite(r"pic.jpg", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
cv2.imwrite(r"pic.jpg", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
完整代码:
import cv2
import numpy as np
img = cv2.imread(r"D:\HL\vs\OpenCVtest\Python_opencv\Python_opencv\pic5.jpg")
emptyImage = np.zeros(img.shape, np.uint8)
emptyImage2 = img.copy()
emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
emptyImage3[...]=0
cv2.imshow("EmptyImage", emptyImage)
cv2.imshow("Image", img)
cv2.imshow("EmptyImage2", emptyImage2)
cv2.imshow("EmptyImage3", emptyImage3)
cv2.imwrite(r"D:\HL\vs\OpenCVtest\Python_opencv\Python_opencv\pic2.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 5])
cv2.imwrite(r"D:\HL\vs\OpenCVtest\Python_opencv\Python_opencv\pic4.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
cv2.imwrite(r"D:\HL\vs\OpenCVtest\Python_opencv\Python_opencv\pic4.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
cv2.imwrite(r"D:\HL\vs\OpenCVtest\Python_opencv\Python_opencv\pic5.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
cv2.waitKey (0)
cv2.destroyAllWindows()
1.5显示图片大小
import cv2
img = cv2.imread(r"D:\HL\vs\OpenCVtest\Python_opencv\Python_opencv\pic2.jpg", cv2.IMREAD_COLOR)
img = cv2.resize(img, (3104, 2048))
cv2.namedWindow('result', cv2.WINDOW_NORMAL) # 窗口大小可以改变
cv2.namedWindow('result', cv2.WINDOW_AUTOSIZE) # 窗口大小不可以改变
cv2.namedWindow('result', cv2.WINDOW_FREERATIO) # 窗口大小自适应比例
cv2.namedWindow('result', cv2.WINDOW_KEEPRATIO) # 窗口大小保持比例
cv2.namedWindow('result', cv2.WINDOW_GUI_EXPANDED) # 显示色彩变成暗色
cv2.imshow('result', img)
cv2.waitKey(0)
太多了不一一展示图片了