2016-05-02 5 views
36

मेरे पास तालिका में पृष्ठों की कुछ छवियां हैं। मैं छवियों से छवियों को फसल करना चाहता हूं। आम तौर पर, पृष्ठ छवि में सबसे बड़ा आयताकार होगा, हालांकि आयत के सभी चार पक्ष कुछ मामलों में दिखाई नहीं दे सकते हैं।छवि के बाहर सबसे बड़ा आयत कैसे फसल करें

मैं निम्नलिखित लेकिन नहीं मिल रहा है वांछित परिणाम कर रहा हूँ:

1 उदाहरण:: मैं इस छवि में आयत पा सकते हैं, हालांकि, चाहते हैं

import cv2 
import numpy as np 

im = cv2.imread('images/img5.jpg') 
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(gray,127,255,0) 
_,contours,_ = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 
areas = [cv2.contourArea(c) for c in contours] 
max_index = np.argmax(areas) 
cnt=contours[max_index] 
x,y,w,h = cv2.boundingRect(cnt) 
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.imshow("Show",im) 
cv2.imwrite("images/img5_rect.jpg", im) 
cv2.waitKey(0) 

नीचे कुछ उदाहरण हैं अगर लकड़ी के शेष हिस्से को भी बाहर निकाल दिया जा सकता है। enter image description here

enter image description here

2 उदाहरण: इस छवि में आयत का सही आयाम नहीं मिल। enter image description here

enter image description here

3 उदाहरण: इस छवि में सही आयाम खोजने के लिए या तो असमर्थ। enter image description here enter image description here

4 उदाहरण: इस रूप में अच्छी तरह के साथ भी यही। enter image description here enter image description here

+3

यह समस्या काफी के बाद से न तो लकड़ी रंग और न ही कागजात ही रंग के हैं करने के लिए कठिन है .... मैं क्या मतलब है, कि सीमा है इस एल्गोरिथ्म में समस्या ... जब से तुम आकृति पा रहे हैं है इस दहलीज के बाद ... मैं या तो रंगीन छवियों में लकड़ी की तरह रंगों को थ्रेसहोल्ड करने की कोशिश करता हूं, या एक अलग दृष्टिकोण का प्रयास करता हूं। आप कुछ किनारे डिटेक्टर को कैनी की तरह कोशिश कर सकते हैं (जिसमें पहले से ही कुछ थ्रेसहोल्डिंग है) और उसके बाद findcontours करें। – api55

उत्तर

25

जैसा कि मैंने पहले कुछ ऐसा किया है, मैंने आटा परिवर्तन के साथ अनुभव किया है, लेकिन वे अपने मामले के लिए समोच्चों का उपयोग करने के लिए सही होने के लिए बहुत कठिन थे। मैं निम्नलिखित सुझाव प्रारंभ करने में मदद करने के लिए है:

  1. आम तौर पर कागज (किनारों, कम से कम), सफेद है, इसलिए आप YUV की तरह एक colorspace पर जाकर बेहतर भाग्य हो सकता है जो बेहतर अलग चमक:

    image_yuv = cv2.cvtColor(image,cv2.COLOR_BGR2YUV) 
    image_y = np.zeros(image_yuv.shape[0:2],np.uint8) 
    image_y[:,:] = image_yuv[:,:,0] 
    
  2. कागज पर पाठ एक समस्या है। इन उच्च आवृत्ति शोर को हटाने (उम्मीद है) को धुंधला प्रभाव का उपयोग करें। आप मस्तिष्क संबंधी संचालन भी कर सकते हैं जैसे कि फैलाव भी।

    image_blurred = cv2.GaussianBlur(image_y,(3,3),0) 
    
  3. आप बल्कि एक साधारण सीमा से एक चालाक किनारे डिटेक्टर लागू करने के लिए, कोशिश कर सकते हैं। जरूरी नहीं है, लेकिन आपकी मदद कर सकता है:

    edges = cv2.Canny(image_blurred,100,300,apertureSize = 3) 
    
  4. फिर समोच्च खोजें। मेरे मामले में मैंने केवल चरम बाहरी रूपों का उपयोग किया था। आप CHAIN_APPROX_SIMPLE ध्वज का उपयोग कर सकते समोच्च संपीड़ित करने के लिए

    contours,hierarchy = cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
    
  5. अब आप आकृति का एक समूह है चाहिए। सही खोजने के लिए समय। प्रत्येक समोच्च cnt के लिए, पहले उत्तल हल करें, फिर जितना संभव हो सके समोच्च को सरल बनाने के लिए approaxPolyDP का उपयोग करें।

    hull = cv2.convexHull(cnt) 
    simplified_cnt = cv2.approxPolyDP(hull,0.001*cv2.arcLength(hull,True),True) 
    
  6. अब हम इस सरलीकृत समोच्च का उपयोग enclosing चतुर्भुज को खोजने के लिए करना चाहिए। आप जिन नियमों के साथ आते हैं उनके साथ आप प्रयोग कर सकते हैं। सबसे आसान तरीका समोच्च के चार सबसे लंबे खंडों को चुन रहा है, और फिर इन चार लाइनों को छेड़छाड़ करके संलग्न चतुर्भुज बनाते हैं। आपके मामले के आधार पर, आप इन लाइनों को रेखा के विपरीत, कोण और समान चीजों के आधार पर पा सकते हैं।

  7. अब आपके पास चतुर्भुज का एक गुच्छा है। अब आप अपने आवश्यक चतुर्भुज को खोजने के लिए दो चरण विधि कर सकते हैं। सबसे पहले आप उन लोगों को हटा दें जो शायद गलत हैं। उदाहरण के लिए चतुर्भुज का एक कोण 175 डिग्री से अधिक है। फिर आप अंतिम परिणाम के रूप में सबसे बड़े क्षेत्र के साथ एक चुन सकते हैं। आप परिणामों मैं इस बिंदु पर मिल गया के रूप में नारंगी समोच्च देख सकते हैं: All Contours

  8. खोजने (उम्मीद) सही चतुर्भुज के बाद अंतिम चरण, वापस एक आयत को बदलने है। इसके लिए आप एक परिवर्तन मैट्रिक्स के साथ आने के लिए findHomography का उपयोग कर सकते हैं।

    (H,mask) = cv2.findHomography(cnt.astype('single'),np.array([[[0., 0.]],[[2150., 0.]],[[2150., 2800.]],[[0.,2800.]]],dtype=np.single)) 
    

    संख्या पत्र कागज करने के लिए पेश यह मानें कि। आप उपयोग करने के लिए बेहतर और अधिक चालाक संख्या के साथ आ सकते हैं। आपको पत्र पत्र के निर्देशांक के आदेश से मेल खाने के लिए समोच्च बिंदुओं को फिर से व्यवस्थित करने की भी आवश्यकता है।

    final_image = cv2.warpPerspective(image,H,(2150, 2800)) 
    

    यह मुड़ने की तरह निम्नलिखित (अपने परिणामों से पहले) कुछ में परिणाम चाहिए: तो फिर तुम अंतिम छवि बनाने के लिए warpPerspective फोन Warping

मुझे आशा है कि यह आप एक को खोजने के लिए मदद करता है आपके मामले में उचित दृष्टिकोण।

+0

मुझे image_y पर त्रुटि मिल रही है [:,:] = imy [:,:, 0] imy परिभाषित नहीं – usernan

+0

@usernan यह गलत था, यह 'image_y [:,:] = image_yuv [:,:, 0] होना चाहिए '। इंगित करने के लिए धन्यवाद। अब यह जवाब में तय है। –

+0

मैं समस्या यू मुझे इस के साथ मदद कर सकता है, मैं ImageMagick के बजाय opencv का उपयोग करने का http://stackoverflow.com/questions/37803903/image-magic-auto-cropping सोच – usernan

10

यह एक बहुत ही जटिल कार्य है जिसे आसानी से समोच्च खोजकर हल नहीं किया जा सकता है। उदाहरण के लिए अर्थशास्त्री कवर केवल पत्रिका के 1 किनारे को दिखाता है जो छवि को आधे हिस्से में विभाजित करता है। आपके कंप्यूटर को कैसे पता होना चाहिए कि कौन सा पत्रिका है और कौन सा टेबल है? तो आपको अपने कार्यक्रम में और अधिक बुद्धिमानी जोड़नी होगी।

आप अपनी छवि में लाइनों को देख सकते हैं। उदाहरण के लिए हफ़ ट्रांसफॉर्म। फिर अधिक या कम समांतर या ऑर्थोगोनल लाइनों के सेट खोजें, एक निश्चित लंबाई की रेखाएं ... सामान्य प्रिंट रंगों या रंगों की जांच करके प्रिंट ढूंढें जिन्हें आप आमतौर पर किसी तालिका पर नहीं पाते हैं। मुद्रित ग्रंथों द्वारा बनाए गए उच्च विपरीत आवृत्तियों की खोज करें ... कल्पना कीजिए कि आप कैसे एक मानव के रूप में मुद्रित कागज को पहचानते हैं ...

यह सब स्टैक ओवरव्लो के लिए एक बहुत व्यापक प्रश्न है। इसे छोटी उप-समस्याओं में विभाजित करने का प्रयास करें, उन्हें हल करने का प्रयास करें और यदि आप दीवार दबाते हैं, तो यहां वापस आएं।

संबंधित मुद्दे