2016-11-06 3 views
0

Спасибо, что прочитали мой вопрос.конвертировать изображение (np.array) в двоичное изображение

Я новичок в python и заинтересовался scipy. Я пытаюсь понять, как я могу сделать образ Racoon (в scipy misc) двоичным (черный, белый). Это не преподается в учебнике по скупой лекции.

Это до сих пор мой код:

%matplotlib inline 
import matplotlib.pyplot as plt 
import numpy as np 
from scipy import misc #here is how you get the racoon image 

face = misc.face() 
image = misc.face(gray=True) 
plt.imshow(image, cmap=plt.cm.gray) 
print image.shape 

def binary_racoon(image, lowerthreshold, upperthreshold): 
    img = image.copy() 
    shape = np.shape(img) 

    for i in range(shape[1]): 
     for j in range(shape[0]): 
      if img[i,j] < lowerthreshold and img[i,j] > upperthreshold: 
       #then assign black to the pixel 
      else: 
       #then assign white to the pixel 

    return img 

    convertedpicture = binary_racoon(image, 80, 100) 
    plt.imshow(convertedpicture, cmap=plt.cm.gist_gray) 

Я видел других людей с помощью OpenCV, чтобы сделать изображение бинарного, но мне интересно, как я могу это сделать таким образом, обернув над пикселями? Я понятия не имею, какое значение следует придавать верхнему и нижнему порогу, поэтому я догадался о 80 и 100. Есть ли способ определить это?

+0

Почему вы ожидали 'lowerthreshold> IMG [I, J] и IMG [I, J], чтобы когда-либо> upperthreshold'' true'? Это означало бы, что '80> 100'! – Eric

ответ

1

Вы overthinking это:

def to_binary(img, lower, upper): 
    return (lower < img) & (img < upper) 

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

+0

ах, и я также вижу, что мне пришлось использовать «или», если бы я хотел продолжить свое направление – User12049279432

1

Вам не нужно перебирать й и у позиции массива изображения. Используйте массив numpy, чтобы проверить, находится ли массив выше порога интереса. Вот некоторый код, который создает логический (истинный/ложный) массив как черно-белое изображение.

# use 4 different thresholds 
thresholds = [50,100,150,200] 

# create a 2x2 image array 
fig, ax_arr = plt.subplots(2,2) 

# iterate over the thresholds and image axes 
for ax, th in zip(ax_arr.ravel(), thresholds): 
    # bw is the black and white array with the same size and shape 
    # as the original array. the color map will interpret the 0.0 to 1.0 
    # float array as being either black or white. 
    bw = 1.0*(image > th) 
    ax.imshow(bw, cmap=plt.cm.gray) 
    ax.axis('off') 

# remove some of the extra white space 
fig.tight_layout(h_pad=-1.5, w_pad=-6.5) 

enter image description here

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