2014-10-29 5 views
9

मैंने scipy.misc.resize के साथ कुछ अजीब देखा - यह परिणामस्वरूप छवि में लगभग 0x1 पिक्सेल शिफ्ट (0,0) से दूर 'निकटतम' परिणामों के अलावा किसी भी इंटरपोलेशन विधि का उपयोग करता है।SciPy छवि आकार बदलने शिफ्ट - अपेक्षित व्यवहार या बग?

यहाँ 6x6 करने के लिए एक 3x3 छवि लेने का एक पूरी तरह से सिंथेटिक उदाहरण है:

>>> src 
array([[ 0., 0., 0.], 
     [ 0., 64., 0.], 
     [ 0., 0., 0.]]) 

>>> imresize(src, (6, 6), interp='bicubic',mode='F') 
array([[ 1., 0., -5., -8., -5., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ -5., 0., 25., 40., 25., 0.], 
     [ -8., 0., 40., 64., 40., 0.], 
     [ -5., 0., 25., 40., 25., 0.], 
     [ 0., 0., 0., 0., 0., 0.]], dtype=float32) 
>>> imresize(src, (6, 6), interp='bilinear',mode='F') 
array([[ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 16., 32., 16., 0.], 
     [ 0., 0., 32., 64., 32., 0.], 
     [ 0., 0., 16., 32., 16., 0.], 
     [ 0., 0., 0., 0., 0., 0.]], dtype=float32) 
>>> imresize(src, (6, 6), interp='nearest',mode='F') 
array([[ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 64., 64., 0., 0.], 
     [ 0., 0., 64., 64., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.]], dtype=float32) 

अब ऐसा लगता है कि द्विरेखीय और bicubic छेड़छाड़ के लिए बड़े पैमाने पर ले जाता है के केंद्र है, लेकिन निकटतम प्रक्षेप के लिए नहीं जाते हैं। यह अजीब और यहां तक ​​कि गंतव्य आकार दोनों के लिए होता है।

मुझे एहसास है कि निर्देशांक की अलग-अलग परिभाषाएं पिक्सेल-केंद्र या पिक्सेल-एज या पिक्सल का इलाज बिंदु नमूने या आयताकार के रूप में अलग-अलग परिणाम देती हैं, लेकिन यह एक बड़ी समस्या की तरह प्रतीत होता है (जब तक कि मुझे कुछ याद नहीं आ रहा है) ।

यहाँ एक और उदाहरण है कि पाली अधिक स्पष्ट रूप से दर्शाता है है:

>>> imresize(src, (7, 3), interp='bilinear',mode='F') 
array([[ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.  , 11.4285717, 11.4285717], 
     [ 0.  , 25.1428566, 25.1428566], 
     [ 0.  , 25.1428566, 25.1428566], 
     [ 0.  , 11.4285717, 11.4285717], 
     [ 0.  , 0.  , 0.  ]], dtype=float32) 

के बाद से कोई क्षैतिज आकार परिवर्तन हुआ, मैं क्षैतिज बड़े पैमाने पर की मेरी केंद्र के समन्वय सब पर स्थानांतरित करने के लिए उम्मीद नहीं होगा, लेकिन यह स्पष्ट रूप से साथ लेकर चलता 1.0 से 1.5 तक।

तो, क्या यह एक बग है या क्या मुझे कुछ याद आ रहा है?

+1

यह बहुत दिलचस्प है। मैंने 'पीआईएल' में भी इसी तरह की चीजें देखी हैं, लेकिन तत्काल स्पष्टीकरण नहीं है। "पिक्सेल-सेंटर" और "पिक्सेल-एज" के बारे में आपका तर्क एक लीड हो सकता है (हालांकि यह सुझाव देता है कि पिक्सल 0 डी अंकों के बजाय वर्ग हैं), साथ ही सीमा विचार और गैर-पूर्णांक एकाधिक आकार बदलने वाले अतिरिक्त प्रभाव। यहां प्रकाश डालने वाली किसी चीज में बहुत दिलचस्पी है। – eickenberg

+1

यह बताता है कि वास्तव में 'पीआईएल' का उपयोग करता है (इस फ़ाइल में कहीं और 'toimage' फ़ंक्शन देखें] (https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py#L392)) – eickenberg

उत्तर

0

लगता है कि यह निश्चित रूप से एक बग है।

from scipy.misc import * 
from scipy.ndimage import measurements 
import numpy as np 

src = imread("src.png") 
cbc = src 
lnr = src 
nrs = src 

for idx in xrange(0, 128): 
    cbc = imresize(cbc, tuple(2 * i for i in cbc.shape), interp='bicubic', mode='F') 
    cbc = imresize(cbc, src.shape, interp='bicubic', mode='F') 

    lnr = imresize(lnr, tuple(2 * i for i in lnr.shape), interp='bilinear', mode='F') 
    lnr = imresize(lnr, src.shape, interp='bicubic', mode='F') 

    nrs = imresize(nrs, tuple(2 * i for i in nrs.shape), interp='nearest', mode='F') 
    nrs = imresize(nrs, src.shape, interp='nearest', mode='F') 

    imsave("nrs_%03d.png" % (idx), nrs) 
    imsave("lnr_%03d.png" % (idx), lnr) 
    imsave("cbc_%03d.png" % (idx), cbc) 

और bilinear/bicubic छवियों सचमुच, जबकि निकटतम गठबंधन रहता है (0,0) हर छवि से चले: मैं निम्नलिखित छोटा स्निपेट लिखा था।

मैं पीआईएल/SciPy लोगों के साथ जांच करूँगा यह देखने के लिए कि यह पहले से तय है या नहीं।

+0

क्या आपने इसके लिए पीआईएल और/या साइपी के साथ एक बग रिपोर्ट दर्ज की है? मुझे अब इस व्यवहार में परेशानी हो रही है। – aganders3

+2

हाँ: https://github.com/scipy/scipy/issues/4112 –

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