您的位置:首页 > 编程语言 > Python开发

python 简单图像处理(7) 计算直方图

2010-12-27 12:54 746 查看
好啦。现在我们来介绍下图像的直方图

说白了,直方图就是统计图像中像素点为某值的个数

对于8位灰度图来说,颜色有256级,统计每级的个数

然后把结果用图表表示出来就可以了

看看程序吧

import cv

def Hist(image):
a = [0]*256
w = image.width
h = image.height
iHist = cv.CreateImage((256,256),8,3)
for i in range(h):
for j in range(w):
iGray = int(image[i,j])
a[iGray] = a[iGray] + 1

S = max(a)
c = cv.RGB(200,150,255)

for k in range(256):
a[k] = a[k]*200/S
x = (k,255)
y = (k,255-a[k])
cv.Line(iHist,x,y,c)

return iHist

image = cv.LoadImage('lena.jpg',0)
iHist = Hist(image)
cv.ShowImage('image',image)
cv.ShowImage('iHist',iHist)
cv.WaitKey(0)


我们先统计各灰度值像素点个数

然后我们把个数值映射到(0,200)的范围

方便我们画图

我们来看看结果吧。



还可以啦

其实OpenCV提供了直方图函数

我简单看了下,没有丝毫思路,以后看懂了再来对比一下

现在我们把一幅图的三个通道放开来看看吧

import cv

def Hist(image,color = cv.RGB(255,255,255)):
a = [0]*256
w = image.width
h = image.height
iHist = cv.CreateImage((256,256),8,3)
for i in range(h):
for j in range(w):
iGray = int(image[i,j])
a[iGray] = a[iGray] + 1

S = max(a)

for k in range(256):
a[k] = a[k]*200/S
x = (k,255)
y = (k,255-a[k])
cv.Line(iHist,x,y,color)

return iHist

def GetChannel(image,num):
w = image.width
h = image.height
size = (w,h)
iGetChannel = cv.CreateImage(size,image.depth,1)
for i in range(h):
for j in range(w):
iGetChannel[i,j] = image[i,j][num]
return iGetChannel

image = cv.LoadImage('lena.jpg',0)
image2 = cv.LoadImage('lena.jpg',1)
iHist = Hist(image)
iRed = GetChannel(image2,2)
iGreen = GetChannel(image2,1)
iBlue = GetChannel(image2,0)
iHistRed = Hist(iRed,cv.RGB(255,0,0))
iHistGreen = Hist(iGreen,cv.RGB(0,255,0))
iHistBlue = Hist(iBlue,cv.RGB(0,0,255))
cv.ShowImage('image',image)
cv.ShowImage('iRed',iRed)
cv.ShowImage('iGreen',iGreen)
cv.ShowImage('iBlue',iBlue)
cv.ShowImage('iHist',iHist)
cv.ShowImage('iHistRed',iHistRed)
cv.ShowImage('iHistGreen',iHistGreen)
cv.ShowImage('iHistBlue',iHistBlue)
cv.WaitKey(0)


有一点要说明的是OpenCV中每个像素三色是按照BGR排列的

运行效果





这些直方图有什么作用呢?

以后再来说明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: