2012-06-22 17 views
6

में एक विशिष्ट आकार के साथ हिस्टोग्राम को कैसे पहचानें मैं टेक्स्ट और छवि भागों में छवियों (पत्रिकाओं से) को विभाजित करना चाहता हूं। मेरी तस्वीर में कई आरओआई के लिए मेरे पास कई हिस्टोग्राम हैं। मैं अजगर (सीवी 2) के साथ 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) 

मान लिया जाये कि लागत पर लाभ 0, 1, 4 और 5 पाठ क्षेत्रों रहे हैं और लागत पर लाभ एक छवि क्षेत्र है, मैं की तरह आउटपुट प्राप्त इस:

  • लागत पर लाभ: 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 ​​प्रदान)

उत्तर

3

आप एक सरल सहसंबंध मीट्रिक का उपयोग कर सकते हैं।

  • सुनिश्चित करें कि हिस्टोग्राम आप की गणना करने और अपने संदर्भ सामान्यीकृत कर रहे हैं (यानी probapilities प्रतिनिधित्व करते हैं)

  • प्रत्येक हिस्टोग्राम गणना के लिए

    (यह देखते हुए कि myRef और myHist NumPy सरणी हैं):

    metric = (myRef * myHist).sum()

  • यह मीट्रिक एक उपाय है कि हिस्टोग्राम आपके संदर्भ की तरह दिखता है।

+0

इस वास्तव में एक दिलचस्प विचार है पा सकते हैं। लेकिन 'myRef' से आपका क्या मतलब है? क्या यह एक और हिस्टोग्राम या 'मायहिस्ट' के समान आकार है? या यह किसी भी मनमानी numpy सरणी है? – samkhan13

+0

@ samkhan13 हां, 'myRef' हिस्टोग्राम है जिसे हम तुलना करना चाहते हैं। – Simon

9

(मामले में अंत में संपादित देखें मैं सवाल गलत समझा):

आप हिस्टोग्राम आकर्षित करने के लिए देख रहे हैं, मैं OpenCV के लिए एक अजगर नमूना पेश किया था, और आप से प्राप्त कर सकते हैं यहाँ:

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

दूसरा एक ग्रेस्केल छवि के लिए अनन्य है जो प्रश्न में आपकी छवि के समान है।

मैं दूसरे और इसके संशोधन दिखाएगा।

नीचे के रूप में एक पूर्ण छवि पर विचार करें:

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

अब मैं छवि के कुछ हिस्से का हिस्टोग्राम लगाना चाहते हैं। ओपनसीवी हिस्टोग्राम फ़ंक्शन के लिए मास्क सुविधा मिली है। सामान्य हिस्टोग्राम के लिए, आपको इसे None सेट करना चाहिए। अन्यथा आपको मुखौटा निर्दिष्ट करना होगा। जहां सफेद अर्थ है कि क्षेत्र हिस्टोग्राम की गणना के लिए इस्तेमाल किया जाना चाहिए, और काली का मतलब है ऐसा नहीं होना चाहिए

मास्क, एक 8 बिट छवि है।

तो मैं नीचे की तरह एक मुखौटा इस्तेमाल किया (पेंट का उपयोग कर बनाया, तो आप अपने उद्देश्यों के लिए अपने स्वयं के मुखौटा बनाने के लिए)।

histogram = hist_lines(img,mask) 

अब नीचे अंतर देखेंगे:

enter image description here

मैं के रूप में नीचे दिए गए कोड की अंतिम पंक्ति बदल

enter image description here

(याद रखें, मान तो मान सामान्यीकृत होते हैं, दिखाया गया वास्तविक पिक्सेल गिनती नहीं है, 255 तक सामान्यीकृत। इसे अपनी पसंद के अनुसार बदलें।)

संपादित करें:

मुझे लगता है कि मैं अपने प्रश्न को गलत समझा। आपको हिस्टोग्राम की तुलना करने की ज़रूरत है, है ना?

अगर ऐसा है जैसे आप चाहते हैं, तो आप cv2.compareHist फ़ंक्शन का उपयोग कर सकते हैं।

this in C++ के बारे में एक अधिकारी ट्यूटोरियल है। आप अपने इसी Python code here.

+0

आप सही हैं, मुझे हिस्टोग्राम की तुलना करने की आवश्यकता है। – soet

+0

@ आदिद रहमान के। मास्क का वास्तव में उपयोग क्या है? मैंने देखा कुछ समारोह मुखौटा कहा। क्या यह कोई दयालु है जिसे हम छवि के आरओआई सेट कर सकते हैं? – Mzk

+0

या, सामान्य रूप से roi आयताकार क्षेत्र है, लेकिन मुखौटा के साथ, आप कोई आकार ले सकते हैं। अधिक जानकारी के लिए मेरे ब्लॉग में समोच्चों के अनुभाग देखें। Opencvpython.blogspot.com –