我想在文本和图像部分中分割图像(来自杂志)。我的图片中有几个ROI的直方图。我使用opencv和python(cv2)。
我想识别看起来像这样的直方图
http://matplotlib.sourceforge.net/users/image_tutorial-6.png
因为它是文本区域的典型形状。我怎样才能做到这一点?
编辑:感谢您的帮助。
我将从ROI获得的直方图与我提供的样本直方图进行了比较:
hist = cv2.calcHist(roi,[0,1], None, [180,256],ranges)
compareValue = cv2.compareHist(hist, samplehist, cv.CV_COMP_CORREL)
print "ROI: {0}, compareValue: {1}".format(i,compareValue)
假设ROI 0,1,4和5是文本区域,ROI是图像区域,我得到这样的输出:
我可以做些什么来避免错误的分类?对于某些图像,错误分类率约为30%,这太高了。
(我也试过CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYY和(hist * samplehist).sum(),但它们也提供了错误的compareValues)
答案 0 :(得分:9)
(如果我误解了这个问题,请参见最后的编辑):
如果你想绘制直方图,我已经向OpenCV提交了一个python样本,你可以从这里得到它:
http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/samples/python2/hist.py
用于绘制两种直方图。第一个适用于彩色和灰度图像,如下所示:http://opencvpython.blogspot.in/2012/04/drawing-histogram-in-opencv-python.html
第二个是灰度图像专用的,与问题中的图像相同。
我将展示第二个及其修改。
考虑如下完整图像:
我们需要绘制直方图,如图所示。检查以下代码:
import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
mask = cv2.imread('mask.png',0)
ret,mask = cv2.threshold(mask,127,255,0)
def hist_lines(im,mask):
h = np.zeros((300,256,3))
if len(im.shape)!=2:
print "hist_lines applicable only for grayscale images"
#print "so converting image to grayscale for representation"
im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
hist_item = cv2.calcHist([im],[0],mask,[256],[0,255])
cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX)
hist=np.int32(np.around(hist_item))
for x,y in enumerate(hist):
cv2.line(h,(x,0),(x,y),(255,255,255))
y = np.flipud(h)
return y
histogram = hist_lines(img,None)
下面是我们得到的直方图。请记住,它是完整图像的直方图。为此,我们为掩码提供了None
。
现在我想找到图像某些部分的直方图。 OpenCV直方图功能有一个掩码工具。对于普通直方图,您应该将其设置为None
。否则你必须指定掩码。
Mask是一个8位图像,其中white表示该区域应该用于直方图计算,而black表示它不应该用于直方图计算。
所以我使用了下面的面具(使用颜色创建,你必须为你的目的创建自己的面具)。
我更改了最后一行代码,如下所示:
histogram = hist_lines(img,mask)
现在看看下面的区别:
(请记住,值是标准化的,因此显示的值不是实际像素数,标准化为255.根据需要更改它。)
编辑:
我想我误解了你的问题。你需要比较直方图,对吗?
如果这是你想要的,你可以使用cv2.compareHist
功能。
有一个关于this in C++的官方教程。您可以找到相应的Python code here.
答案 1 :(得分:3)
您可以使用简单的关联指标。
确保您计算的直方图和参考值已标准化(即代表概率)
(假设myRef和myHist是numpy数组):
metric = (myRef * myHist).sum()
此指标衡量直方图的参考程度。