2016-12-06 7 views
0

Я хочу изменить размер изображения в соответствии с форматом меньшего размера. Например, я хотел бы изменить размер изображения размером 100x100 пикселей на изображение размером 58x58 пикселей. Значениями массива являются значения интенсивности или потока. Я хочу, чтобы полная трансформация изображения сохранялась после преобразования. Это не работает с изменением размера изображения. Мое общее значение уменьшается в зависимости от того, какой коэффициент I масштабируется или уменьшаться. Я показал ниже код, который я пробовал до сих пор.изменение размера обрезки общая сумма массива

import numpy as np 
from skimage.transform import resize 


image=fits.open(directory+file1) 
cutout=image[0].data 
out = resize(cutout, (58,58), order=1, preserve_range=True) 
print(np.sum(out),np.sum(cutout)) 

Мой вывод:

0.074657436655 0.22187 (I want these two values to be equal) 

Если я растягивать его на той же размерности с помощью:

out = resize(cutout, (100,100), order=1, preserve_range=True) 
print(np.sum(out),np.sum(cutout)) 

Мой выход очень близко к тому, что я хочу:

0.221869631852 0.22187 

У меня такая же проблема, если я пытаюсь увеличить а также размер изображения.

out = resize(cutout, (200,200), order=1, preserve_range=True) 
print(np.sum(out),np.sum(cutout)) 

Выход:

0.887316320731 0.22187 

Я хотел бы знать, если есть обходной путь для этой проблемы.

EDIT 1:

Я просто понял, что если я умножить мое изображение на квадрат шкалы которого я хочу, чтобы увеличить или уменьшить размер моего изображения, то моя общая сумма сохраняется.

Например:

x=58 
out = resize(cutout, (x,x), order=1, preserve_range=True) 
test=out*(100/x)**2 
print(np.sum(test),np.sum(cutout)) 

Мой выход очень близко к тому, что я хочу, но немного выше:

0.221930548915 0.22187 

Я попытался это с разными размерами и он работает на самом деле, за исключением малых значений. Может ли кто-нибудь объяснить, почему это отношение истинно или это просто статистическое совпадение.

+0

почему не только перенормировки интенсивности после масштабирования? – maxymoo

+0

Должен ли я нормализовать свою интенсивность как квадрат моего масштабирующего фактора? Если это так, можете ли вы сказать мне, почему это отношение верно? – Vishnu

+0

Вы можете посмотреть: http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.downscale_local_mean –

ответ

3

Если рассматривать изображение I = Width x Height где N = Width x Height в виде набора пикселей с интенсивностью в диапазоне [0,1], это совершенно нормально, что после того, как изменение размера изображения, чтобы M = newWidth x newWeight сумма интенсивностей полностью отличается от ранее.

Предположим, что изображение I с N пикселей имеет интенсивности, равномерно распределенные в диапазоне [0,1]. Тогда сумма интенсивностей будет приблизительно равна 0.5 * N. Если вы используете skimage's resize, изображение будет изменено до более низкого (или большего) размера на interpolating. Интерполяция не накапливает значения (как вы, кажется, ожидаете), вместо этого среднее значение значений в окрестности, чтобы предсказать значение каждого из пикселей в новом изображении. Таким образом, диапазон интенсивности изображения не изменяется, значения изменены, и, таким образом, сумма интенсивностей нового измененного изображения будет приблизительно равна 0.5 * M. Если M != N, то сумма интенсивностей будет сильно отличаться.

Что вы можете сделать, чтобы решить эту проблему:

  1. Масштабирует новых данных пропорционально его размеру:

    >>> y, x = (57, 58) 
    >>> out = resize(data, (y,x), order=1, preserve_range=True) 
    >>> out = out * (data.shape[0]/float(y)) * (data.shape[1]/float(x)) 
    

    Что аналогично тому, что вы предлагаете, но и для любого размера изображение (а не только квадратные изображения). Это, однако, компенсирует каждый пиксель с постоянным коэффициентом out[i,j] *= X, где X равно для каждого пикселя изображения, и не все пиксели будут интерполированы с одинаковым весом, таким образом, добавляя небольшие искусственные артефакты.

  2. Я думаю, что лучше всего заменить общую сумму изображения (которая зависит от количества пикселей на изображении) со средней интенсивностью изображения (которая не зависит от количества пикселей)

    >>> meanI = np.sum(I)/float(I.size) # Exactly the same as np.mean(I) or I.mean() 
    >>> meanInew = np.sum(out)/float(out.size) 
    >>> np.isclose(meanI, meanInew) # True 
    
+0

Спасибо за ссылку и ваш ответ. Я понимаю это сейчас, это было очень хорошо объяснено. – Vishnu

Смежные вопросы