- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python OpenCV 直方图的计算与显示的方法示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 。
直方图的背景知识、用途什么的就直接略过去了。这里直接介绍方法.
计算并显示直方图 。
与C++中一样,在Python中调用的OpenCV直方图计算函数为cv2.calcHist.
cv2.calcHist的原型为:
1
|
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])
#返回hist
|
通过一个例子来了解其中的各个参数:
1
2
3
4
5
6
7
8
9
10
|
#coding=utf-8
import
cv2
import
numpy as np
image
=
cv2.imread(
"D:/histTest.jpg"
,
0
)
hist
=
cv2.calcHist([image],
[
0
],
#使用的通道
None
,
#没有使用mask
[
256
],
#HistSize
[
0.0
,
255.0
])
#直方图柱的范围
|
其中第一个参数必须用方括号括起来.
第二个参数是用于计算直方图的通道,这里使用灰度图计算直方图,所以就直接使用第一个通道; 。
第三个参数是Mask,这里没有使用,所以用None.
第四个参数是histSize,表示这个直方图分成多少份(即多少个直方柱)。第二个例子将绘出直方图,到时候会清楚一点.
第五个参数是表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素.
最后是两个可选参数,由于直方图作为函数结果返回了,所以第六个hist就没有意义了(待确定) 。
最后一个accumulate是一个布尔值,用来表示直方图是否叠加.
彩色图像不同通道的直方图 。
下面来看下彩色图像的直方图处理。以最著名的lena.jpg为例,首先读取并分离各通道:
1
2
3
4
5
|
import
cv2
import
numpy as np
img
=
cv2.imread(
"D:/lena.jpg"
)
b, g, r
=
cv2.split(img)
|
接着计算每个通道的直方图,这里将其封装成一个函数:
1
2
3
4
5
6
7
8
9
10
11
|
def
calcAndDrawHist(image, color):
hist
=
cv2.calcHist([image], [
0
],
None
, [
256
], [
0.0
,
255.0
])
minVal, maxVal, minLoc, maxLoc
=
cv2.minMaxLoc(hist)
histImg
=
np.zeros([
256
,
256
,
3
], np.uint8)
hpt
=
int
(
0.9
*
256
);
for
h
in
range
(
256
):
intensity
=
int
(hist[h]
*
hpt
/
maxVal)
cv2.line(histImg,(h,
256
), (h,
256
-
intensity), color)
return
histImg;
|
这里只是之前代码的简单封装,所以注释就省掉了.
接着在主函数中使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
if
__name__
=
=
'__main__'
:
img
=
cv2.imread(
"D:/lena.jpg"
)
b, g, r
=
cv2.split(img)
histImgB
=
calcAndDrawHist(b, [
255
,
0
,
0
])
histImgG
=
calcAndDrawHist(g, [
0
,
255
,
0
])
histImgR
=
calcAndDrawHist(r, [
0
,
0
,
255
])
cv2.imshow(
"histImgB"
, histImgB)
cv2.imshow(
"histImgG"
, histImgG)
cv2.imshow(
"histImgR"
, histImgR)
cv2.imshow(
"Img"
, img)
cv2.waitKey(
0
)
cv2.destroyAllWindows()
|
这样就能得到三个通道的直方图了,如下:
更进一步 。
这样做有点繁琐,参考abid rahman的做法,无需分离通道,用折线来描绘直方图的边界可在一副图中同时绘制三个通道的直方图。方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#coding=utf-8
import
cv2
import
numpy as np
img
=
cv2.imread(
'D:/lena.jpg'
)
h
=
np.zeros((
256
,
256
,
3
))
#创建用于绘制直方图的全0图像
bins
=
np.arange(
256
).reshape(
256
,
1
)
#直方图中各bin的顶点位置
color
=
[ (
255
,
0
,
0
),(
0
,
255
,
0
),(
0
,
0
,
255
) ]
#BGR三种颜色
for
ch, col
in
enumerate
(color):
originHist
=
cv2.calcHist([img],[ch],
None
,[
256
],[
0
,
256
])
cv2.normalize(originHist, originHist,
0
,
255
*
0.9
,cv2.NORM_MINMAX)
hist
=
np.int32(np.around(originHist))
pts
=
np.column_stack((bins,hist))
cv2.polylines(h,[pts],
False
,col)
h
=
np.flipud(h)
cv2.imshow(
'colorhist'
,h)
cv2.waitKey(
0
)
|
结果如下图所示:
代码说明:
这里的for循环是对三个通道遍历一次,每次绘制相应通道的直方图的折线。for循环的第一行是计算对应通道的直方图,经过上面的介绍,应该很容易就能明白.
这里所不同的是没有手动的计算直方图的最大值再乘以一个系数,而是直接调用了OpenCV的归一化函数。该函数将直方图的范围限定在0-255×0.9之间,与之前的一样。下面的hist= np.int32(np.around(originHist))先将生成的原始直方图中的每个元素四舍六入五凑偶取整(cv2.calcHist函数得到的是float32类型的数组),接着将整数部分转成np.int32类型。即61.123先转成61.0,再转成61。注意,这里必须使用np.int32(...)进行转换,numpy的转换函数可以对数组中的每个元素都进行转换,而Python的int(...)只能转换一个元素,如果使用int(...),将导致only length-1 arrays can be converted to Python scalars错误.
下面的pts = np.column_stack((bins,hist))是将直方图中每个bin的值转成相应的坐标。比如hist[0] =3,...,hist[126] = 178,...,hist[255] = 5;而bins的值为[[0],[1],[2]...,[255]]。使用np.column_stack将其组合成[0, 3]、[126, 178]、[255, 5]这样的坐标作为元素组成的数组.
最后使用cv2.polylines函数根据这些点绘制出折线,第三个False参数指出这个折线不需要闭合。第四个参数指定了折线的颜色.
当所有完成后,别忘了用h = np.flipud(h)反转绘制好的直方图,因为绘制时,[0,0]在图像的左上角。这在直方图可视化一节中有说明.
NumPy版的直方图计算 。
在查阅abid rahman的资料时,发现他用NumPy的直方图计算函数np.histogram也实现了相同的效果。如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#coding=utf-8
import
cv2
import
numpy as np
img
=
cv2.imread(
'D:/lena.jpg'
)
h
=
np.zeros((
300
,
256
,
3
))
bins
=
np.arange(
257
)
bin
=
bins[
0
:
-
1
]
color
=
[ (
255
,
0
,
0
),(
0
,
255
,
0
),(
0
,
0
,
255
) ]
for
ch,col
in
enumerate
(color):
item
=
img[:,:,ch]
N,bins
=
np.histogram(item,bins)
v
=
N.
max
()
N
=
np.int32(np.around((N
*
255
)
/
v))
N
=
N.reshape(
256
,
1
)
pts
=
np.column_stack((
bin
,N))
cv2.polylines(h,[pts],
False
,col)
h
=
np.flipud(h)
cv2.imshow(
'img'
,h)
cv2.waitKey(
0
)
|
效果图和上面的一个相同。NumPy的histogram函数将在NumPy通用函数这篇博文中介绍,这里就不详细解释了。这里采用的是与一开始相同的比例系数的方法,参考本文的第二节.
另外,通过NumPy和matplotlib可以更方便的绘制出直方图,下面的代码供大家参考,如果有机会,再写的专门介绍matplotlib的文章.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import
matplotlib.pyplot as plt
import
numpy as np
import
cv2
img
=
cv2.imread(
'D:/lena.jpg'
)
bins
=
np.arange(
257
)
item
=
img[:,:,
1
]
hist,bins
=
np.histogram(item,bins)
width
=
0.7
*
(bins[
1
]
-
bins[
0
])
center
=
(bins[:
-
1
]
+
bins[
1
:])
/
2
plt.bar(center, hist, align
=
'center'
, width
=
width)
plt.show()
|
这里显示的是绿色通道的直方图.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/sunny2038/article/details/9097989 。
最后此篇关于Python OpenCV 直方图的计算与显示的方法示例的文章就讲到这里了,如果你想了解更多关于Python OpenCV 直方图的计算与显示的方法示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!