【发布时间】:2016-05-31 12:46:52
【问题描述】:
我正在尝试研究随着我逐渐减少照片质量而导致的图像质量下降。
为此,我设计了这个实验: - 获取输入图像,并在每次迭代中循环抽取 n 倍和 n-2 倍,获得新图像 A 和 B - 使用 sp.ndimage.interpolation.zoom 上采样到原始大小 A 和 B,缩放因子为 n 和 n-2 - 在每次迭代中计算上采样 A 和 B 之间的元素差异的元素的 mse - 检查每次迭代中 mse 的变化。
这是我的代码:
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from skimage import io, feature, color, exposure
# import an image
tut=io.imread('http://www.two-views.com/images/Tut%20bone%20frag.jpg')
tut=color.rgb2gray(io.imread('Tut.jpg'))
# contrast stretching
p2, p98 = np.percentile(tut, (2, 98))
st_tut = exposure.rescale_intensity(tut, in_range=(p2, p98))
# decimate progressively, upsample, calculate mse
mse_tut = []
for n in range(6,50,2):
temp1 = st_tut[::n,::n]
temp2 = st_tut[::n-2,::n-2]
tempz1 = sp.ndimage.interpolation.zoom(temp1, n, order=2)
tempz2 = sp.ndimage.interpolation.zoom(temp2, n-2, order=2)
mse_temp = ((tempz2 - tempz1) ** 2).mean(axis=None)
mse_tut.append(mse_temp)
问题是我收到此错误消息:
---> 11 mse_temp = ((tempz2 - tempz1) ** 2).mean(axis=None)
ValueError:操作数无法与形状一起广播 (400,400) (402,402)
我不确定为什么会发生这种情况,因为当我在下面尝试时,一切运行顺利:
temp1 = st_tut[::10,::10]
temp2 = st_tut[::8,::8]
tempz1 = sp.ndimage.interpolation.zoom(temp1, 10, order=2)
tempz2 = sp.ndimage.interpolation.zoom(temp2, 8, order=2)
print temp1.shape, temp2.shape
print tempz1.shape, tempz2.shape
mse_temp = ((tempz2 - tempz1) ** 2).mean(axis=None)
print mse_temp
(40, 40) (50, 50)
(400, 400) (400, 400)
0.00981401032334
【问题讨论】:
-
st_tut.shape是什么,n的哪个迭代会崩溃? -
st_tut.shape 是 400,400,当我在笔记本中工作时,我不确定它在哪个迭代中崩溃
-
我敢打赌它是第一个。答案即将到来。
-
是的。这是第一个。如果您对不精确多重上采样没问题,那么有一个简单的解决方法,而不必费劲。
标签: python for-loop multidimensional-array scipy zooming