2012-06-22 6 views
6

テキストと画像の部分で画像を(雑誌から)分割したいと思っています。私は私の写真のいくつかのROIのヒストグラムをいくつか持っています。私はpython(cv2)でopencvを使用します。opencv/pythonで特定の形のヒストグラムを認識する方法

私はそれがテキスト領域の典型的な形状であるとして、この

http://matplotlib.sourceforge.net/users/image_tutorial-6.png

のように見えるのヒストグラムを認識します。どうやってやるの?

編集:これまでのご協力ありがとうございます。

私は私が提供されたサンプルのヒストグラムに自分の関心領域から得たヒストグラム比較:ROI 0、1、4及び5は、テキスト領域であり、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、compareValue:1.0
  • ROI:1、compareValue:-0.000195522081574 < ---間違って分類
  • ROI:2、compareValue: 0.0612670248952
  • ROI:3、compareValue:-0.000517370176887
  • ROI:4、compareValue:1.0
  • ROI:5、compareValue:1.0

私が間違って分類を避けるために何ができますか?一部の画像では、誤分類率が約30%と高くなりすぎます。

(私は(.SUM)CV_COMP_CHISQR、CV_COMP_INTERSECT、CV_COMP_BHATTACHARYYと(HISTの*のsamplehistでも試してみました)しかし、彼らはまた、間違ったcompareValuesを提供)

答えて

3

あなたは、単純な相関メトリックを使用することができます。

  • あなたが計算ヒストグラムとあなたの参照は、正規化された(probapilitiesをすなわち表す)されていることを確認し

  • 各ヒストグラムの計算(myRefとmyHistがnumpyの配列であることを考えると)について:

    metric = (myRef * myHist).sum()

  • このメトリックは、ヒストグラムが参照のように見える程度の尺度です。

+0

これは本当に興味深い考えです。 'myRef'はどういう意味ですか? 'myHist'と同じヒストグラムか同じサイズですか?または任意のnumpyの配列ですか? – samkhan13

+0

@ samkhan13はい、 'myRef'は比較したいヒストグラムです。 – Simon

9

(私は質問を誤解した場合に最後にEDITを参照してください):

あなたはヒストグラムを描画するために探しているなら、私はOpenCVの1つのPythonサンプルを提出していた、とあなたからそれを得ることができますここに:

http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/samples/python2/hist.py

ヒストグラムの2種類を描画するために使用されます。ここに示すように、カラー画像とグレースケール画像の両方に適用可能な最初の画像:http://opencvpython.blogspot.in/2012/04/drawing-histogram-in-opencv-python.html

2番目の画像は質問の画像と同じです。

2番目とその変更を示します。私たちは、あなたが示されているようヒストグラムを描画する必要がある

enter image description here

:以下のように

は、完全なイメージを考えてみましょう。以下のコードを確認してください:

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を与えました。

enter image description here

今私は、画像の一部のヒストグラムを見つけたいです。 OpenCVヒストグラム関数にはマスク機能があります。通常のヒストグラムの場合は、Noneに設定する必要があります。それ以外の場合は、マスクを指定する必要があります。

マスクは8ビットイメージです。白は領域をヒストグラム計算に使用する必要があることを示し、黒色は使用しないでください。

私は以下のようなマスクを使用しました(ペイントを使用して作成しました。目的に合わせて独自のマスクを作成する必要があります)。

enter image description here

Iは以下のようにコードの最後の行を変更:

enter image description here

(値ような値は、正規化され、覚えて:

histogram = hist_lines(img,mask) 

次に以下差が見255に正規化された実際のピクセル数ではありません。好きなように変更してください。

EDIT:

私は私はあなたの質問を誤解だと思います。あなたはヒストグラムを比較する必要がありますよね?

これが必要な場合は、cv2.compareHist機能を使用できます。

this in C++に関する公式チュートリアルがあります。あなたはそれに対応して見つけることができますPython code here.

+0

あなたが正しいです、私はヒストグラムを比較する必要があります。 – soet

+0

@Abid Rahman K.マスクの使用は正確に何ですか?私はいくつかの機能マスクを見た。イメージのROIを設定することはできますか? – Mzk

+0

ya、通常roiは長方形の領域ですが、マスクを使用すると、任意の形を取ることができます。詳細については、ブログの輪郭のセクションを確認してください。 Opencvpython.blogspot.com –

関連する問題