6

(雑誌の) 画像をテキスト部分と画像部分に分割したいと考えています。写真にいくつかの ROI のヒストグラムがあります。私はpython(cv2)でopencvを使用しています。

こんなヒストグラムを認識したい

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 が画像領域であると仮定すると、次のような出力が得られます。

  • ROI: 0、比較値: 1.0
  • ROI: 1、compareValue: -0.000195522081574 <--- 間違った分類
  • ROI: 2、比較値: 0.0612670248952
  • ROI: 3、比較値: -0.000517370176887
  • ROI: 4、比較値: 1.0
  • ROI: 5、比較値: 1.0

分類を間違えないようにするにはどうすればよいですか?一部の画像では、誤分類率が約 30% であり、これは高すぎます。

(CV_COMP_CHISQR、CV_COMP_INTERSECT、CV_COMP_BHATTACHARYY、および(hist * samplehist).sum()でも試しましたが、間違ったcompareValueも提供します)

4

2 に答える 2

9

(私が質問を誤解した場合に備えて、最後の編集を参照してください):

ヒストグラムを描画する場合は、Pythonサンプルを1つOpenCVに送信しました。これは、ここから入手できます。

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番目とその変更を示します。

以下のような完全な画像を検討してください。

ここに画像の説明を入力してください

あなたが示したように、ヒストグラムを描く必要があります。以下のコードを確認してください。

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。それ以外の場合は、マスクを指定する必要があります。

マスクは8ビットの画像で、白はヒストグラムの計算に領域を使用する必要があることを示し、黒は使用しないことを意味します。

そこで、以下のようなマスクを使用しました(ペイントを使用して作成しました。目的に応じて独自のマスクを作成する必要があります)。

ここに画像の説明を入力してください

コードの最後の行を次のように変更しました:

histogram = hist_lines(img,mask)

次に、以下の違いを参照してください。

ここに画像の説明を入力してください

(値は正規化されているため、表示されている値は実際のピクセル数ではなく、255に正規化されていることに注意してください。必要に応じて変更してください。)

編集 :

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

それがあなたが望むものであるならば、あなたはcv2.compareHist関数を使うことができます。

これに関する公式チュートリアルがC++にあります。対応するPythonコードはここにあります。

于 2012-06-22T20:52:16.310 に答える