椒盐噪声
高斯噪声
均值滤波cv.blur(img,ksize,anchor,borderType)
高斯滤波cv.GaussianBlur(img,ksize,sigmaX,sigmaY,borderType)
中值滤波cv.medianBlur(img,ksize)
双边滤波
cv.filter2D(img, ddepth, ksize)
目录
matplotlib库入门
1.绘图区域
2.图标题
3.x,y轴标签
4.x,y范围
5.绘图
6.显示网格
7.显示
8.创建子图
9.子图标题
10.保存图
直方图
1.灰度直方图
2.掩膜的应用
3.直方图均衡化
4.自适应直方图均衡化
总结,这节课你学到了什么
安装方法见第一节课
import matplotlib.pyplot as plt
plt.figure(num,figsize,dpi,bgcolor.edgecolor,frameon)
num:编号
figsize:二维变量(w1,h1),图大小,单位英寸
dpi:每英寸像素个数
bgcolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
plt.title(string)
plt.xlabel()
plt.ylabel()
plt.xlim((star,end))
plt.ylim((star,end))
star:坐标轴起点数据
end:坐标轴终点数据
plt.plot(图变量,format_string)
plt.plot(x,y,format_string)
x:x数值列表
y:y数值列表
format_string:线类型
plt.grid()
plt.show()
axes[r1,c1].imshow(img)
子图显示,RGB类型,一个通道时默认填充G通道,加参数plt.cm.gray灰度图显示
fig,axes=plt.subplots(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
fig:整体对象
axes:子图对象,二维数组
nrows,:子图行数
ncols:子图列数
sharex,sharey:子图使用相同x轴或y轴
subplot_kw:创建各子图关键词词典
**fig_kw:创建其他关键字
axes[r1,c1]=plt.set_title(string)
plt.savefig(图片路径)
直方图是对数据进行统计的一种方法,并将其统计值组织到一系列定义好的bin中,bin译为“直条”或“组距”。其数值是从数据中计算的特征统计量。可以是梯度,颜色,方向等。
原理:图像直方图是表示亮度像素个数分布的直方图,在这个图中按照亮度间距分割成多个区域直条,直条高度代表数量。最左边直条表示最暗像素的数量,最右边直条表示亮度最高的像素数量。
注意:直方图是根据灰度进行绘制,而不是彩色图像
一些术语:
dims:需要统计的特征数目,dims=1表示只统计一个数据灰度值
bins:直条的数量
Range:统计范围,例如灰度值[0,255]
cv.calcHIst([img],[channels],mask,[histSize],ranges,hist,accumulate)
channels:如果是灰度图[0],彩色图[0],[1],[2]代表B,G,R
mask:掩模图像,统计整个图为None。
histSize:bin的数目,用[]括起来
range:像素范围,一般都是[0,255]
举例:
#5.1
import cv2 as cv import numpy as np import matplotlib.pyplot as plt pic1 = cv.imread("2.jpeg",0)#读取灰度图 hist1=cv.calcHist([pic1],[0],None,[255],[0,255]) cv.imshow("img",pic1) #绘制图像 plt.figure(1,(5,5),100) plt.plot(hist1) plt.xlabel('huidu') plt.ylabel('num') plt.show() cv.waitKey(0)
结果:
掩膜是遮挡处理图像的区域,用来控制处理的图像范围,掩膜是由0,1组成的二进制图层,1表示要处理,0表示不处理
掩膜的作用
【1】提取感兴趣区域
【2】遮挡屏蔽区域
【3】结构特征提取
【4】特殊形状图像制作
【5】在遥感图像中运用广泛
查找一些区域用1组成的白色掩膜,屏蔽区域用0组成的黑色掩膜
一些图像数学运算公式
cv.bitwise_and(img1,img2,mask=掩膜矩阵) 按位与
cv.bitwise_or(img1,img2,,mask=掩膜矩阵) 按位或
cv.bitwise_not(img1,img2,,mask=掩膜矩阵) 按位非
cv.bitwise_nor(img1,img2,,mask=掩膜矩阵) 按位异或
举例
#5.2
import cv2 as cv import numpy as np import matplotlib.pyplot as plt #解决中文显示问题 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False pic1 = cv.imread("2.jpeg",0)#读取灰度图 #创建掩膜 mask=np.zeros(pic1.shape[:2],np.uint8) mask[100:300,100:300]=255#255是十进制,代表二进制1111111 #查看掩膜图像 mask_pic=cv.bitwise_and(pic1,pic1,mask=mask) #统计掩膜后图像 hist1=cv.calcHist([pic1],[0],mask,[255],[0,255]) #绘制图像 fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,10)) axes[0,0].set_title("原图") axes[0,0].imshow(pic1,plt.cm.gray) axes[0,1].set_title("掩膜") axes[0,1].imshow(mask,plt.cm.gray) axes[1,0].set_title("掩膜后") axes[1,0].imshow(mask_pic,plt.cm.gray) axes[1,1].set_title("掩膜后直方图") axes[1,1].grid() axes[1,1].plot(hist1) plt.show() cv.waitKey(0)
结果:
当直方图集中在一个区域时,就会显得整体很亮,所以将他的直方图拉伸使得灰度值分布区域增大,扩大像素值分布范围,提高对比度,使得曝光更充足,突出细节。
res=cv.equalizeHist(img)
举例:
#5.3
import cv2 as cv import numpy as np import matplotlib.pyplot as plt #解决中文显示问题 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False pic1 = cv.imread("2.jpeg",0)#读取灰度图 hist1=cv.calcHist([pic1],[0],None,[255],[0,255]) #均衡化 equ_pic=cv.equalizeHist(pic1) hist2=cv.calcHist([equ_pic],[0],None,[255],[0,255]) #绘制图像 fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,10)) axes[0,0].set_title("原图") axes[0,0].imshow(pic1,plt.cm.gray) axes[0,1].set_title("均衡化图") axes[0,1].imshow(equ_pic,plt.cm.gray) axes[1,0].set_title("原图直方图") axes[1,0].grid() axes[1,0].plot(hist1) axes[1,1].set_title("均衡化直方图") axes[1,1].grid() axes[1,1].plot(hist2) plt.show() cv.waitKey(0)
结果:
由于是全局均衡化,会导致有些地方太亮,有些地方太暗而丢失许多细节。所以要分成多个小块,对每个小块进行均衡化,这些小块被称为”tiles”瓦片(默认8x8大小),为了防止噪声被放大使用对比度限制,如果直方图bin超过对比度上限就会均匀分布到其他bins中,再进行均衡化。
最后为了拼接每个小块,去除边界使用双线性差值
clahe=cv.createCLAHE(clipLimit,tileGridSize)
Clahe:均衡化条件,返回值
clipLimit:对比度限制,默认40
titleGridSize:瓦片大小,默认8x8
Img=clahe.apply(img)
举例
#5.4
import cv2 as cv import numpy as np import matplotlib.pyplot as plt #解决中文显示问题 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False pic1 = cv.imread("2.jpeg",0)#读取灰度图 hist1=cv.calcHist([pic1],[0],None,[255],[0,255]) #自适应均衡化 clahe=cv.createCLAHE(40) cla_pic=clahe.apply(pic1) hist2=cv.calcHist([cla_pic],[0],None,[255],[0,255]) #绘制图像 fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,10)) axes[0,0].set_title("原图") axes[0,0].imshow(pic1,plt.cm.gray) axes[0,1].set_title("自适应均衡化图") axes[0,1].imshow(cla_pic,plt.cm.gray) axes[1,0].set_title("原图直方图") axes[1,0].grid() axes[1,0].plot(hist1) axes[1,1].set_title("自适应均衡化直方图") axes[1,1].grid() axes[1,1].plot(hist2) plt.show() cv.waitKey(0)
结果:
plt.figure(num,figsize,dpi,bgcolor.edgecolor,frameon)
plt.title(string)
plt.xlabel()
plt.ylabel()
plt.xlim((star,end))
plt.ylim((star,end))
plt.plot(图变量,format_string)
plt.plot(x,y,format_string)
plt.grid()
plt.show()
fig,axes=plt.subplots(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
axes[r1,c1].imshow(img)axes[r1,c1]=plt.set_title(string)
plt.savefig(图片路径)
cv.bitwise_and(img1,img2,mask=掩膜矩阵) 按位与
cv.bitwise_or(img1,img2,,mask=掩膜矩阵) 按位或
cv.bitwise_not(img1,img2,,mask=掩膜矩阵) 按位非
cv.bitwise_nor(img1,img2,,mask=掩膜矩阵) 按位异或
cv.calcHIst([img],[channels],mask,[histSize],ranges,hist,accumulate)
res=cv.equalizeHist(img)
clahe=cv.createCLAHE(clipLimit,tileGridSize)
Img=clahe.apply(img)