本文记录了小白作者opencv的学习历程,仅供参考!
作者是使用python做图像处理,在pycharm中安装opencv库:File>>setting>>Python Interpreter 点击+号,搜索opencv-python进行下载。
一、图像读取原理
图像的基本单位是像素,300*500的图片就是由300*500=150000个像素组成,每个像素可以看成单元格,每个单元格的颜色可以使用不同的像素值代表(0-255,0代表黑色,255代表白色,数值越大,颜色越浅)
opencv的图像读取就是使用像素单元格的原理,使用cv2.imread()函数,读取并便利每个单元格的像素值。
进行图像读取时,一般有两个参数:
读取彩色图片时为img=cv2.imread("my.jpg",cv2.IMREAD_UNCHANGED),cv2.IMREAD_GRAYSCALE参数可换为3
读取灰度图片时为
img=cv2.imread("my.jpg",cv2.IMREAD_GRAYSCALE),cv2.IMREAD_GRAYSCALE参数可换为0
二、图像显示函数cv2.imshow() [函数原型 cv2.inshow(name,img)]
图像显示原理是获得像素数组img的size,设定一张空白图片,将提取出来的像素数组中的单位像素赋值到空白图片进行显示。
一般cv2.imshow()需要和cv2.waitKey(0)配合使用。cv2.waitKey(a)是一个界面退出函数,根据参数a的取值判断如何退出界面。当a=0时,时间无限长,直到有键按下,退出界面。当a>0时,函数返回值为按下的键的ASCII码值,超时返回-1,图像显示a秒,有窗口显示的时候,waitKey才有作用。
Matplotlib图像显示库
注意:OpneCv读取的图像格式是BGR格式的,而matplotlib显示图像是以RGB格式进行显示,所以,我们需要对图像进行格式转化,从BGR通道转为RGB通道格式,这样显示出来才不会有色差。
三、图像保存函数cv2.imwrite(filepath,img,num)
filepath:保存文件路径
img:读取图像数组,保存之前要先读取
num:可选参数,可以省略
图片属性:
基本属性:像素、分辨率、大小、颜色、位深、色调、饱和度、亮度、色彩通道、图像的层次。
使用shape函数能获得图片的属性:下面是获得图片的尺寸和色彩通道。
仅获得图片尺寸:
ROI兴趣区域
机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,既ROI。opencv中常用到算子(operator)和函数来求得ROI。ROI属于IVE技术(智能视频编码)的一种,在不损失图像质量的前提下,优化视频性能。
下面的代码是获得一块高度200:400,宽度200:500区域的图像:
ROI区域移植
ROI区域移植在生活中的应用最普遍的就是给图片添加水印,将想添加的内容添加到图片上。
将一幅图片添加到另一幅图片,代码如下:
图像通道
对于图像通道是指彩色图片,灰度图片一般不考虑,彩色图片由三基色B\G\R通过混合而成,Python中对于通道的获取通过对像素组进行操作实现。B(blue),G(green),R(red),蓝绿红。代码如下:
import cv2 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] img=cv2.imread("jiesi.jpg") #3通道获取 B=img[:,:,0] G=img[:,:,1] R=img[:,:,2] #打印3通道 print('B',B) print('G',G) print('R',R) B= cv2.cvtColor(B,cv2.COLOR_BGR2RGB) G= cv2.cvtColor(G,cv2.COLOR_BGR2RGB) R= cv2.cvtColor(R,cv2.COLOR_BGR2RGB) #显示图像 titles = ['B通道', 'G通道','R通道'] #标题 images = [B,G,R] #图像对比显示 for i in range(3): plt.subplot(1,3,i+1), plt.imshow(images[i]) plt.title(titles[i]) plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴 plt.show()#显示图像
可以使用B, G, R = cv2.split(img) split()函数拆分通道,将三基色分组
B, G, R = cv2.split(img)的效果跟 B=img[:,:,0] G=img[:,:,1] R=img[:,:,2]是一样的
图像通道合并
opencv中通道的合并主要通过cv2.merge([B, G, R]) 函数实现,其中的参数变为BGR通道。
opencv图像灰度处理的四种方法和原理
四种方法:基于OpenCV库函数的图像灰度化、最大值灰度化、平均值灰度化、Gamma校正灰度化
图像灰度化处理:将3通道图像的B\R\G通道的像素值从不相等设置为相等的过程。
一、基于OpenCV库函数的图像灰度化
cv2.cvtColor()函数灰度处理:
函数使用:img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img:需要进行处理的图像
cv2.COLOR_BGR2GRAY:固定参数,对图像进行灰度处理固定使用,OpenCV读取图像 通过BGR空间进行读取,因此需要将BGR转换成GRAY进行灰度化。
代码如下:
#引入图片,将图片进行灰度化处理,将BGR格式转换成GRAY格式 将得到的图片进行转换格式, # BGR转换成RGB,最后使用matplotlib.pyplot库中的函数进行显示 import cv2 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文 img=cv2.imread("jiesi.jpg") hui=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img=cv2.cvtColor(hui,cv2.COLOR_BGR2RGB) plt.imshow(img) plt.title("杰斯议员灰度处理") plt.axis("off") plt.show()
二、最大值灰度化
最大值灰度化原理:最大值灰度化原理就是以B、G、R通道中最大的像素值作为整体像素,公式为:B=G=R=max([B,G,R])
三、平均值灰度化
平均值灰度化的原理:对B、G、R三通道像素求平均值作为灰度值,公式为:gray=(B+G+R)/3
四、Gamma校正灰度化
四种灰度化方法的效果比较:
代码如下:
import cv2 import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文 #读取第一张图像 img=cv2.imread("jiesi.jpg") #获取图像尺寸 h,w=img.shape[0:2] gray1= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#BGR转换为灰度显示格式 #库函数,Y亮度 #自定义空白单通道图像,用于存放灰度图 gray2=np.zeros((h,w),dtype=img.dtype)#最大值 gray3=np.zeros((h,w),dtype=img.dtype)#平均值 gray4=np.zeros((h,w),dtype=img.dtype)#Gamma校正灰度处理 #对原图像进行遍历,然后分别对B\G\R按比例灰度化 for i in range(h): for j in range(w): gray2[i,j]=max(img[i,j,0],img[i,j,1],img[i,j,2]) #最大值 for i in range(h): for j in range(w): gray3[i,j]=(int(img[i,j,0])+int(img[i,j,1])+int(img[i,j,2]))/3 #平均值 for i in range(h): for j in range(w): a=img[i,j,2]**(2.2)+1.5*img[i,j,1]**(2.2)+0.6*img[i,j,0]**(2.2) #分子 b=1+1.5**(2.2)+0.6**(2.2) #分母 gray4[i,j]=pow(a/b,1.0/2.2) #开2.2次方根 #Gamma校正灰度处理 #BGR转换为RGB显示格式,方便通过matplotlib进行图像显示 gray1= cv2.cvtColor(gray1,cv2.COLOR_BGR2RGB) gray2= cv2.cvtColor(gray2,cv2.COLOR_BGR2RGB) gray3= cv2.cvtColor(gray3,cv2.COLOR_BGR2RGB) gray4= cv2.cvtColor(gray4,cv2.COLOR_BGR2RGB) #显示图像 titles = ['cv2.cvtColor()', '最大值灰度化','平均值灰度化','Gamma校正灰度化'] #标题 images = [gray1, gray2,gray3,gray4] #图像对比显示 for i in range(4): plt.subplot(1,4,i+1), plt.imshow(images[i]) plt.title(titles[i]) plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴 plt.show()#显示图像