У меня были следующие коды, использующие Python и OpenCV. Вкратце, у меня есть стопка снимков, сделанных с разной фокусной глубиной. Коды выбирают пиксели в каждой позиции (x, y), которая имеет наибольший лапласианский отклик гуасиана среди всех фокальных глубин (z), создавая таким образом изображение с наложенным фокусом. Функция get_fmap
создает двумерный массив, в котором каждый пиксель будет содержать номер фокальной плоскости, имеющей наибольший логарифмический отклик. В следующих кодах закомментированные строки являются моей текущей реализацией VIPS. Они не выглядят совместимыми в определении функции, потому что это лишь частичное решение.
# from gi.repository import Vips
def get_log_kernel(siz, std):
x = y = np.linspace(-siz, siz, 2*siz+1)
x, y = np.meshgrid(x, y)
arg = -(x**2 + y**2) / (2*std**2)
h = np.exp(arg)
h[h < sys.float_info.epsilon * h.max()] = 0
h = h/h.sum() if h.sum() != 0 else h
h1 = h*(x**2 + y**2 - 2*std**2) / (std**4)
return h1 - h1.mean()
def get_fmap(img): # img is a 3-d numpy array.
log_response = np.zeros_like(img[:, :, 0], dtype='single')
fmap = np.zeros_like(img[:, :, 0], dtype='uint8')
log_kernel = get_log_kernel(11, 2)
# kernel = get_log_kernel(11, 2)
# kernel = [list(row) for row in kernel]
# kernel = Vips.Image.new_from_array(kernel)
# img = Vips.new_from_file("testimg.tif")
for ii in range(img.shape[2]):
# img_filtered = img.conv(kernel)
img_filtered = cv2.filter2D(img[:, :, ii].astype('single'), -1, log_kernel)
index = img_filtered > log_response
log_response[index] = img_filtered[index]
fmap[index] = ii
return fmap
а затем fmap
будет использоваться для выделения пикселей из разных фокальных плоскостей для создания изображения с фокусировкой.
Это делается на очень большом изображении, и я считаю, что VIPS может с этим справиться лучше, чем OpenCV. Однако официальная документация предоставляет довольно скудную информацию о его привязке к Python. Из информации, которую я могу найти в Интернете, я могу заставить работать свертку изображений (что в моем случае на порядок быстрее, чем OpenCV). Мне интересно, как это реализовать в VIPS, особенно эти строки?
log_response = np.zeros_like(img[:, :, 0], dtype = 'single')
index = img_filtered > log_response
log_response[index] = im_filtered[index]
fmap[index] = ii