[图像识别]6.Opencv的直方图与matplotlib库入门

回顾,上节课你学到了什么?

椒盐噪声

高斯噪声

均值滤波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.自适应直方图均衡化

 总结,这节课你学到了什么


matplotlib库入门

安装方法见第一节课

import matplotlib.pyplot as plt

1.绘图区域

plt.figure(num,figsize,dpi,bgcolor.edgecolor,frameon)

num:编号

figsize:二维变量(w1,h1),图大小,单位英寸

dpi:每英寸像素个数

bgcolor:背景颜色

edgecolor:边框颜色

frameon:是否显示边框

2.图标题

plt.title(string)

3.x,y轴标签

plt.xlabel()

plt.ylabel()

4.x,y范围

plt.xlim((star,end))

plt.ylim((star,end))

star:坐标轴起点数据

end:坐标轴终点数据

5.绘图

plt.plot(图变量,format_string)

plt.plot(x,y,format_string)

x:x数值列表

y:y数值列表

format_string:线类型

6.显示网格

plt.grid()

7.显示

plt.show()

axes[r1,c1].imshow(img)

子图显示,RGB类型,一个通道时默认填充G通道,加参数plt.cm.gray灰度图显示

8.创建子图

fig,axes=plt.subplots(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)

fig:整体对象

axes:子图对象,二维数组

nrows,:子图行数

ncols:子图列数

sharex,sharey:子图使用相同x轴或y轴

subplot_kw:创建各子图关键词词典

**fig_kw:创建其他关键字

9.子图标题

axes[r1,c1]=plt.set_title(string)

10.保存图

plt.savefig(图片路径)

直方图

直方图是对数据进行统计的一种方法,并将其统计值组织到一系列定义好的bin中,bin译为“直条”或“组距”。其数值是从数据中计算的特征统计量。可以是梯度,颜色,方向等。

1.灰度直方图

原理:图像直方图是表示亮度像素个数分布的直方图,在这个图中按照亮度间距分割成多个区域直条,直条高度代表数量。最左边直条表示最暗像素的数量,最右边直条表示亮度最高的像素数量。

注意:直方图是根据灰度进行绘制,而不是彩色图像

一些术语:

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)

结果:

[图像识别]6.Opencv的直方图与matplotlib库入门_第1张图片

 

2.掩膜的应用

掩膜是遮挡处理图像的区域,用来控制处理的图像范围,掩膜是由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)

结果:

[图像识别]6.Opencv的直方图与matplotlib库入门_第2张图片

 

3.直方图均衡化

当直方图集中在一个区域时,就会显得整体很亮,所以将他的直方图拉伸使得灰度值分布区域增大,扩大像素值分布范围,提高对比度,使得曝光更充足,突出细节。

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)

结果:

[图像识别]6.Opencv的直方图与matplotlib库入门_第3张图片

 

4.自适应直方图均衡化

由于是全局均衡化,会导致有些地方太亮,有些地方太暗而丢失许多细节。所以要分成多个小块,对每个小块进行均衡化,这些小块被称为”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)

结果:

[图像识别]6.Opencv的直方图与matplotlib库入门_第4张图片

 总结,这节课你学到了什么

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)

你可能感兴趣的:(黑马python,图像识别处理笔记,opencv,python,matplotlib,图像处理,人工智能)