OpenCV的学习

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()

运行效果
OpenCV的学习

值得说明的是括号里的数字分别代表了什么
OpenCV的学习
这是用了shape函数,shape返回的是图像的行数,列数,色彩通道数。
易错的地方:

行数其实对应于坐标轴上的y,即表示的是图像的高度

列数对应于坐标轴上的x,即表示的是图像的宽度

也就是说shape返回的是(高度, 宽度) = (y , x)
所以这里的意思是566高,550宽,色彩通道数为3
为直观看到,我将改变后的图片进行保存

cv2.imwrite('after.jpg',img2)

OpenCV的学习
然后点击详细信息
OpenCV的学习
嗯确实是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)

如图
OpenCV的学习
这样看数字没有直观感觉,所以,我运用到图片上,还拿上面的夏目为例
上代码:

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()

OpenCV的学习
改动一个数字即可

cv2.imshow('pic', img1)
cop_img = img1.copy()
cop_img[:,:,0] = 0
cop_img[:,:,2] = 0
cv2.imshow('only_green', cop_img)

OpenCV的学习

cv2.imshow('pic', img1)
cop_img = img1.copy()
cop_img[:,:,1] = 0
cop_img[:,:,2] = 0
cv2.imshow('only_blue', cop_img)

OpenCV的学习
总之记住: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()

OpenCV的学习

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。
下面是以不同质量存储的两幅图:
OpenCV的学习
对于PNG,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越高,图像尺寸越小。默认级别为3:

cv2.imwrite(r"pic.jpg", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0]) 

OpenCV的学习

cv2.imwrite(r"pic.jpg", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

OpenCV的学习
完整代码:

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)

太多了不一一展示图片了

1.6图片边缘处理

上一篇:2021-01-31


下一篇:OpenCV 轮廓查找与绘制-最小外接矩形