Как уменьшить часть изображения с помощью метода numpy.compress?(NumPy + scikit-изображение) - PullRequest
1 голос
/ 27 марта 2019

Привет, используя пример изображения phantom.png Я выполняю некоторые операции с библиотеками numpy + skimage и после некоторых модификаций, которые запрашивает последнее упражнение:

Сжать размер центральных пятен на 50% и построить окончательное изображение.

Это шаги, которые я делаю раньше.

Я читаю изображение, делая

img = imread(os.path.join(data_dir, 'phantom.png'))

Затем примените следующее, чтобы сделать его черно-белым

img[np.less_equal(img[:,:,0],50)] = 0
img[np.greater_equal(img[:,:,0],51)] = 255

Взял пару кусочков изображения (черные пятна) с заданными координатами

img_slice=img.copy() 
img_slice=img_slice[100:300, 100:200]
img_slice2=img.copy() 
img_slice2=img_slice2[100:300, 200:300]

Теперь переверните их

img_slice=np.fliplr(img_slice)
img_slice2=np.fliplr(img_slice2)

И положить их обратно в копию изображения

img2=img.copy()
img2[100:300, 200:300]=img_slice 
img2[100:300, 100:200]=img_slice2

И это результирующее изображение перед последним ("сжать") упражнением:

enter image description here

Затем меня просят «уменьшить» черные пятна с помощью метода numpy.compress.

Ожидаемый результат после использования метода «компресс» - следующее изображение (скриншот), где черные пятна уменьшены на 50%:

Но я понятия не имею, как использовать метод numpy.compress над изображением или срезами изображения, чтобы получить этот результат, даже не близко, все, что я получаю, это просто куски изображения, которые выглядят как обрезанные или растянутые части его .

enter image description here

Буду признателен за любую помощь / объяснение того, как метод numpy.compress работает в этом вопросе, и даже если возможно использовать его для этого.

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Вы, кажется, в порядке с обрезкой и извлечением, но просто застряли в аспекте compress . Итак, обрежьте середину и сохраните это как im, и мы сжимаем это на следующем шаге. Заполните область, из которой вы обрезаны, белым цветом.

Теперь сожмите ту часть, которую вы вырезали. Чтобы уменьшить на 50%, вам нужно взять чередующиеся строки и чередующиеся столбцы, так:

# Generate a vector alternating between True and False the same height as "im"
a = [(i%2)==0 for i in range(im.shape[0])]

# Likewise for the width
b = [(i%2)==0 for i in range(im.shape[1])]

# Now take alternate rows with numpy.compress()
r = np.compress(a,im,0)

# And now take alternate columns with numpy.compress()
res = np.compress(b,r,1)

Наконец, верните res обратно в исходное изображение, сместив его на половину ширины и высоты относительно того места, где вы его вырезали.

1 голос
/ 17 мая 2019

Проверьте приведенный ниже код для желаемого выхода.Прокомментируйте, если вам нужно объяснение для приведенного ниже кода.

import os.path
from skimage.io import imread
from skimage import data_dir
import matplotlib.pyplot as plt
import numpy as np

img = imread(os.path.join(data_dir, 'phantom.png'))
img[np.less_equal(img[:,:,0],50)] = 0
img[np.greater_equal(img[:,:,0],51)] = 255

img_slice=img[100:300,100:200]
img_slice2=img[100:300,200:300]

img_slice=np.fliplr(img_slice)
img_slice2=np.fliplr(img_slice2)

img2=img.copy()
img2[100:300, 200:300]=img_slice 
img2[100:300, 100:200]=img_slice2

#extract the left and right images
img_left = img2[100:300,100:200]
img_right = img2[100:300,200:300]

#reduce the size of the images extracted using compress
#numpy.compress([list of states as True,False... or 1,0,1...], axis = (0 for column-wise and 1 for row-wise))
#In state list whatever is False or 0 that particular row should will be removed from that matrix or image
#note: len(A) -> number of rows and len(A[0]) number of columns

#reducing the  height-> axis  = 0
img_left = img_left.compress([not(i%2) for i in range(len(img_left))],axis = 0)
#reducing the  width-> axis  = 1
img_left = img_left.compress([not(i%2) for i in range(len(img_left[0]))],axis = 1)

#reducing the  height-> axis  = 0
img_right = img_right.compress([not(i%2) for i in range(len(img_right))],axis = 0)
#reducing the  width-> axis  = 1
img_right = img_right.compress([not(i%2) for i in range(len(img_right[0]))],axis = 1)

#clearing the area before pasting the left and right minimized images
img2[100:300,100:200] = 255 #255 is for whitening the pixel
img2[100:300,200:300] = 255

#paste the reduced size images back into the main picture(but notice the coordinates!)
img2[150:250,125:175] = img_left
img2[150:250,225:275] = img_right
plt.imshow(img2)

numpy.compress документ здесь .

1 голос
/ 24 апреля 2019

Полагаю, вы можете сначала вырезать центральные пятна с помощью: center_spots = img2 [100: 300,100: 300]

Затем вы можете заменить значения центральных пятен в исходном изображении на 255 (белое) img2 [100: 300,100: 300] = 255

, затем сожмите center_spots на 50% вдоль обеих осей и добавьте полученный результат обратно к img2, форма сжатого изображения будет (100,100), поэтому добавьте к img2 [150: 250,150: 250]

...