opencv教程(基于python)----直方图

通过直方图你可以对政府图象的灰度分布有一个整体的了解。直方图其实也是对图象的另一种解释,我们可以对图象的对比度,亮度和灰度分布有一个直观的认识。
那么我们可以从opencv和numpy的函数得到图象的灰度直方图。先说opencv的函数cv2.calcHist()。

cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)

第一参数是输入的图像,不过要加上中括号;第二个是信道,灰度图的话是零也要加上中括号形如:[0];第三个是掩模图像,没有的话为None;第四个是BNG的数目也要加上中括号的;第五个是像素的范围一般是[0,256],中括号。其他的可以忽略了。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
hist=cv2.calcHist([img1],[0],None,[256],[0,256])
plt.plot(hist),plt.title('gray hist')
plt.xticks([0,256])
plt.show()

显示图像
最简单的直接用matplotlib的函数

import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
plt.hist(img.ravel(),256,[0,256])
plt.show()

显示图片
接下来看看用numpy的函数先说一个运行速度最快的np.bincount()函数

np.bincount(x, weights=None, minlength=None)

第一个参数是输入的以为数组;第二个参数可以忽略;第三个参数是数据的范围最好设置一下。

np.histogram(a, bins=10, range=None, normed=False, weights=None,
density=None)

a是代指数据;bins代指分类区间的个数;range是区间的范围(最小值,最大值)。返回的值有每个区间内数据的个数,区间的个数(+1)。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
hists=np.bincount(img1.ravel(),minlength=256)
hist,bin=np.histogram(img1.ravel(),256,[0,256])
plt.subplot(1,2,1),plt.plot(hists),plt.title('bincount')
plt.subplot(1,2,2),plt.plot(hist),plt.title('histogram')
plt.show()

显示图形
虽然显示的效果是一样的,但是运行速度最快的还是opencv的函数。

下面这个例子显示的是图象的三个信道的直方图。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg')
color=('b','g','r')
for i,col in enumerate(color):#enumerate是枚举函数同时得到数组的索引和值
    histr=cv2.calcHist([img1],[i],None,[256],[0,256])
    plt.plot(histr,color=col)
    plt.xlim([0,256])
plt.show()

显示图像
下面一段程序是使用前面的掩码求一部分区域的直方图。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
#the shape of the photo(300, 300, 3)
mask=np.zeros((300,300),np.uint8)
mask[100:200,100:200]=255
masked_img=cv2.bitwise_and(img1,img1,mask=mask)
hist_full=cv2.calcHist([img1],[0],None,[256],[0,256])
hist_mask=cv2.calcHist([img1],[0],mask,[256],[0,256])
plt.subplot(2,2,1),plt.imshow(img1,'gray')
plt.subplot(2,2,2),plt.imshow(mask,'gray')
plt.subplot(2,2,3),plt.imshow(masked_img,'gray')
plt.subplot(2,2,4),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

显示图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值