簡體   English   中英

如何在opencv / python中識別具有特定形狀的直方圖

[英]How to recognize histograms with a specific shape in opencv / python

我想在文本和圖像部分中分割圖像(來自雜志)。 我的圖片中有幾個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是圖像區域,我得到如下輸出:

  • ROI:0,compareValue:1.0
  • 投資回報率:1,compareValue:-0.000195522081574 <---錯誤分類
  • 投資回報率:2,compareValue:0.0612670248952
  • 投資回報率:3,compareValue:-0.000517370176887
  • 投資回報率:4,compareValue:1.0
  • 投資回報率:5,compareValue:1.0

我該怎么做才能避免錯誤的分類? 對於某些圖像,錯誤分類率約為30%,這太高了。

(我也嘗試過CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYY和(hist * samplehist).sum()但它們也提供了錯誤的compareValues)

(如果我誤解了這個問題,請參見最后的編輯):

如果你想繪制直方圖,我已經向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 否則你必須指定掩碼。

掩碼是一個8位圖像,其中白色表示該區域應用於直方圖計算,黑色表示不應該。

所以我使用了下面的面具(使用顏色創建,你必須為你的目的創建自己的面具)。

在此輸入圖像描述

我更改了最后一行代碼,如下所示:

histogram = hist_lines(img,mask)

現在看看下面的區別:

在此輸入圖像描述

(請記住,值是標准化的,因此顯示的值不是實際像素數,標准化為255.根據需要更改它。)

編輯:

我想我誤解了你的問題。 你需要比較直方圖,對嗎?

如果這是你想要的,你可以使用cv2.compareHist函數。

在C ++中有一個關於的官方教程。 您可以在此處找到相應的Python代碼。

您可以使用簡單的關聯度量標准。

  • 確保您計算的直方圖和參考標准化(即表示概率)

  • 對於每個直方圖計算(假設myRef和myHist是numpy數組):

    metric = (myRef * myHist).sum()

  • 此指標衡量直方圖看起來像您的參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM