使用matplotlib进行图形直方图的绘制

1.直方图

  1. 一个灰度图像一般是由一个二维数组组成,即n行和n列个数组成。其中每一个像素的值都在0到255之间。使用坐标进行显示时,很坐标代表图像的灰度集,纵坐标显示灰度集的个数。使用图像来表示为
    在这里插入图片描述
    读取灰度图像的过程中我们得到的是一个二维数组,但是反映到坐标轴上是一个一维数组,这个是由我们可以使用np.ravel()将一个二维数组转换成一个一维数组。使用的函数:result=cv2.hist(一维数组,bins)
    其中bins一般设置成256.
import cv2
import matplotlib.pyplot as plt
import  numpy as np
o=cv2.imread('D:\cc1\\boat.bmp',cv2.IMREAD_GRAYSCALE)#以灰度图像进行读取图像
print(o.shape)
print(o.ravel().shape)#将二维数组变成一维数组
plt.hist(o.ravel(),256)
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()

结果为

(576, 720)
(414720,)

在这里插入图片描述
2. 归一化直方图在直方图的基础上把纵坐标以占总数的比例进行显示。
在这里插入图片描述

2.计算图像中每个像素的个数 calcHist

1.函数:result=cv2.calcHist(images,chanel,mask,histSize,range,accumulate),这里面的变量都要使用list类型

images原始图像可以是灰度图像或者彩色图像
chanels指定通道灰度图像只有值0彩色图像0,1,2分别代表bgr
mask掩码图像用一段黑白黑白图片进行掩饰
histSizebins的数量一般设置为256
ranges像素范围RANGE一般设置为[0,255]
accumulate累计标识一般使用默认
import cv2
import matplotlib.pyplot as plt
o=cv2.imread('D:/cc1/lenacolor.png')
calc_b=cv2.calcHist([o],[0],None,[256],[0,255])#读取b通道
calc_g=cv2.calcHist([o],[1],None,[255],[0,255])#读取g通道
calc_r=cv2.calcHist([o],[2],None,[255],[0,255])#读取r通道
print(calc_b.shape)
plt.plot(calc_b,color='b')#color 可以设置颜色 bgr
plt.plot(calc_g,color='g')
plt.plot(calc_r,color='r')
plt.show()

结果为
在这里插入图片描述

  1. 掩码:在图像中黑色代表不可见白色代表可见,掩码的动作就是首先设置一个和原图像大小一样的黑色区域,然后再改掉图像上一部分值改成255即可:
    在这里插入图片描述
import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread('D:/cc1/lenacolor.png')
o=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
creat_mask=np.zeros(o.shape,np.uint8)#创建一个和图像大小一样的黑色区域
print(o.shape)
creat_mask[200:400,200:400]=255#设置图像中的白色区域
s1=cv2.calcHist([o],[0],creat_mask,[256],[0,255])
s2=cv2.calcHist([o],[0],None,[256],[0,255])
plt.plot(s1)
plt.title('mask')
plt.figure()
plt.plot(s2)
plt.title('no_mask')
plt.show()

在这里插入图片描述

## 3.matplot中的plot绘图介绍:函数:
result=plt.plot(x,y)如果很坐标是从0开始,并且按照等差数列为1的趋势进行递增,则x可以省略:
import  matplotlib.pyplot as plt
import  numpy as np
s1_x=np.arange(7)#生成0到7
s1_y=np.sin(s1_x)
plt.plot(s1_x,s1_y)#生成sin图像
plt.title('sin')#标题
plt.figure()#进行图像分离
s2_y=[2,3,5,6,7,5,6]
plt.plot(s1_x,s2_y)
plt.title('hvae_s1_x')
plt.figure()
plt.plot(s2_y)
plt.title('no_s1_x')
plt.show()

结果为
在这里插入图片描述

.## 4.直方图均衡化处理:

1.有些图像再拍摄的时候,有的地方太亮,有些地方太暗,导致图像边缘化太明显,这个时候我们可以使用这种方式进行处理:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200522153716487.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L09ZTUtfU0s=,size_16,color_FFFFFF,t_70
2.均衡化处理的算法:
先根据图像的像素计算出图像的直方图——然后计算出图像的归一化直方图——归一化累计直方图——均衡画直方图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.均衡化处理的函数:result=cv2.equalizehist()

import cv2
import matplotlib.pyplot as plt
import  numpy as np
o=cv2.imread('D:/cc1/lenacolor.png')
o=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
c1=cv2.imread('D:/cc1/equ.bmp',cv2.IMREAD_GRAYSCALE)
c3=cv2.imread('D:/cc1/equ2.bmp',cv2.IMREAD_GRAYSCALE)
r1=cv2.equalizeHist(o)
r2=cv2.equalizeHist(c1)
r4=cv2.equalizeHist(c3)
plt.subplot(221)
plt.hist(o.ravel(),256,label='第一个')
plt.title('original')
plt.subplot(222)
plt.hist(r1.ravel(),256,label='第二个')
plt.title('o_equlize')
plt.subplot(223)
plt.hist(r2.ravel(),256,label='第三个')
plt.title('c1_equlize')
plt.subplot(224)
plt.hist(r4.ravel(),256,label='第四个')
plt.title('c2_equlize')
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()

结果为
在这里插入图片描述## 5.subplot—将多个图形放到同一个表格中:

import cv2
import  matplotlib.pyplot as plt
import  numpy as np
o=cv2.imread('D:/cc1/girl.bmp')
s1_b=cv2.calcHist([o],[0],None,[256],[0,255])
s1_g=cv2.calcHist([o],[1],None,[256],[0,255])
s1_r=cv2.calcHist([o],[2],None,[256],[0,255])
plt.subplot(131),plt.plot(s1_b)#创建一个1行3列的表格并蒋图形放到第一个表格中
plt.subplot(132),plt.plot(s1_g)#放到第二个
plt.subplot(133),plt.plot(s1_r)#放到三个
plt.show()

结果为
在这里插入图片描述

注:本次文章根据李老师视频进行编写:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值