2014-10-29 24 views
9

Tôi nhận thấy điều gì đó kỳ lạ với scipy.misc.resize - có vẻ như sử dụng bất kỳ phương thức nội suy nào khác với kết quả 'gần nhất' trong khoảng 1 x1 pixel thay đổi từ (0,0) trong hình ảnh kết quả.Thay đổi kích thước hình ảnh SciPy - hành vi hoặc lỗi dự kiến?

Dưới đây là một ví dụ hoàn toàn tổng hợp tham gia một hình ảnh 3x3 đến 6x6:

>>> 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) 

Bây giờ có vẻ như trung tâm của di chuyển khối lượng cho Bilinear và interpolations bicubic, nhưng không di chuyển cho phép nội suy gần nhất. Điều này xảy ra cho cả hai kích thước đích lẻ và chẵn.

Tôi nhận ra rằng các định nghĩa khác nhau của tọa độ là pixel-center hoặc pixel-edge hoặc xử lý pixel như mẫu điểm hoặc hình chữ nhật sẽ cho kết quả hơi khác nhau trong quá trình lấy mẫu lại, nhưng điều này có vẻ như là một vấn đề lớn. .

Dưới đây là một ví dụ thể hiện sự thay đổi rõ ràng hơn:

>>> 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) 

Vì không có sự thay đổi kích thước ngang xảy ra, tôi không mong chờ điều phối ngang của trung tâm của tôi về khối lượng để di chuyển ở tất cả, nhưng rõ ràng di chuyển từ từ 1,0 đến 1,5.

Vì vậy, đây có phải là lỗi hoặc tôi thiếu gì đó không?

+1

Điều này rất thú vị. Tôi đã quan sát những thứ tương tự ngay cả trong 'PIL', nhưng không có lời giải thích ngay lập tức. Lý do của bạn về "pixel-center" và "pixel-edge" có thể là khách hàng tiềm năng (mặc dù điều này gợi ý rằng pixel là hình vuông thay vì 0d điểm), cũng như xem xét đường viền và các hiệu ứng bổ sung với thay đổi kích thước nhiều số nguyên. Rất quan tâm đến bất cứ điều gì có thể làm sáng tỏ ở đây. – eickenberg

+1

Chỉ ra rằng scipy thực sự sử dụng 'PIL' (xem hàm' toimage' ở nơi khác trong [tệp này] (https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py#L392)) – eickenberg

Trả lời

0

Dường như đây chắc chắn là một lỗi. Tôi đã viết đoạn mã ngắn sau đây:

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) 

và hình ảnh song phương/bicubic theo nghĩa đen cách xa (0,0) mọi hình ảnh, trong khi căn chỉnh gần nhất.

Tôi sẽ kiểm tra với PIL/SciPy folks để xem liệu nó đã được cố định hay chưa.

+0

Bạn có phải nộp báo cáo lỗi với PIL và/hoặc SciPy cho việc này không? Tôi đang gặp rắc rối với hành vi này ngay bây giờ. – aganders3

+2

Vâng: https://github.com/scipy/scipy/issues/4112 –

Các vấn đề liên quan