Как изменить цвета двоичного изображения с помощью Python? - PullRequest
0 голосов
/ 26 июня 2019

Есть ли какой-либо способ изменить цвета двоичного изображения на два других разных цвета, кроме черного и белого, используя python.Как этого добиться, если входное двоичное изображение имеет тип данных «unit8» и когда то же входное изображение имеет тип данных «bool»?

import gdal
from skimage.filters import threshold_otsu
import matplotlib.pyplot as plt

d = gdal.Open(....)
band = d.GetRasterBand(1)
arr1 = band.ReadAsArray()
thresh = threshold_otsu(arr1)
binary = arr1 > thresh
plt.imshow(binary)

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Вы можете сделать это с помощью палитры, но здесь я делаю полную версию RGB.

from PIL import Image
from skimage import data
from skimage.filters import threshold_otsu

# Load image
image = data.camera()

# Threshold image to binary
thresh = threshold_otsu(image)
binary = image > thresh

# Make 3 channel RGB image same dimensions
RGB = np.zeros((binary.shape[0],binary.shape[1],3), dtype=np.uint8)

# Make True pixels red
RGB[binary]  = [255,0,0]
# Make False pixels blue
RGB[~binary] = [0,0,255]

# Display result
Image.fromarray(RGB).show()

enter image description here


Вы можете выразить одно и то же немного иначе:

from skimage import data
from skimage.filters import threshold_otsu

# Load image
image = data.camera()

# Threshold image to binary
thresh = threshold_otsu(image)
binary = image > thresh

# Define red and blue
red  = np.array([255,0,0],dtype=np.uint8)
blue = np.array([0,0,255],dtype=np.uint8)

# Make RGB array, pre-filled with blue
RGB = np.zeros((binary.shape[0],binary.shape[1],3), dtype=np.uint8) + blue

# Overwrite with red where threshold exceeded, i.e. where mask is True
RGB[binary] = red

Хранение полного изображения RGB только для 2 цветов занимает довольно много места, поскольку у вас есть 3 байта (R, G и B) на пиксель. Вероятно, предпочтительнее создать палитризованное изображение, в котором вы просто сохраняете 1 байт на пиксель и используете этот байт в качестве индекса в палитре, которая может содержать 256 цветов. Вы можете сделать это так:

from PIL import Image
from skimage import data
from skimage.filters import threshold_otsu

# Load image
image = data.camera()

# Threshold image to binary
thresh = threshold_otsu(image)
binary = image > thresh

# Make a palette with 2 entries, magenta and yellow
palette = [  
    255, 0, 255,  # magenta
    255, 255, 0   # yellow
]

# Zero-pad the palette to 256 RGB colours, i.e. 768 values
palette += (768-len(palette))*[0]

# Make PIL/Pillow image from the binary array
p = Image.fromarray((binary*1).astype(np.uint8))

# Push the palette into image and save
p.putpalette(palette)
p.save('result.png')

enter image description here

0 голосов
/ 26 июня 2019

ну, вообще говоря, учитывая, что у вас есть изображение x, y и, следовательно, массив типа bool; вам нужно сгенерировать (x, y, 3) массив как с помощью numpy:

colImage = np.zeros((x,y,3), dtype="uint8")

размер с 3 кодирует цвет с помощью rgb, поэтому

colImage[:,:,0] = boolImage * 255 # for red
colImage[:,:,1] = boolimage * 255 # for green
colImage[:,:,2] = boolimage * 255 # for blue

если я правильно помню. * 255 - получить от логического «1» до 8-битного максимума 255

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...