Acesso de pixel de imagem e tipos de dados
Depois que a imagem é lida no programa, ela existe como uma matriz numpy, portanto, todas as funções da matriz numpy também são aplicáveis à imagem. O acesso aos elementos da matriz é, na verdade, um acesso aos pixels da imagem.
1. Acesso aos pixels da imagem
O método de acesso à imagem colorida é: img[i,j,c]
i representa o número de linhas da imagem, j representa o número de colunas da imagem, c representa o número de canais da imagem (RGB três canais correspondem a 0, 1, 2 respectivamente) e as coordenadas começam na parte superior canto esquerdo.
O método de acesso à imagem em tons de cinza é: gray[i,j]
Exemplo 1: Saída dos valores de pixel da 20ª linha e 30ª coluna no canal G da imagem do gatinho, o exemplo de código é o seguinte:
from skimage import io,data
img=data.chelsea()
pixel=img[20,30,1]
print(pixel)
A saída é
129
Exemplo 2: Exibir uma imagem vermelha de canal único, o exemplo de código é o seguinte:
from skimage import io,data
img=data.chelsea()
R=img[:,:,0]
io.imshow(R)
2. Modificação dos pixels da imagem
Além de ler os pixels, você também pode modificar os valores dos pixels.
Exemplo 3: Adicione ruído de sal e pimenta aleatoriamente à imagem do gatinho, o exemplo de código é o seguinte:
from skimage import io,data
import numpy as np
img=data.chelsea()
#随机生成5000个椒(盐)噪声
rows,cols,dims=img.shape
for i in range(5000):
x=np.random.randint(0,rows)
y=np.random.randint(0,cols)
img[x,y,:]=255
io.imshow(img)
O random no pacote numpy é usado aqui para gerar números aleatórios, e randint(0,cols) significa gerar aleatoriamente um inteiro variando de 0 a cols.
Use a sentença img[x,y,:]=255 para modificar o valor do pixel e altere o valor original do pixel de três canais para 255.
3. Corte de imagem
Ao recortar a matriz, o recorte da imagem pode ser realizado.
Exemplo 4: Cortando a imagem do gatinho, o exemplo de código é o seguinte:
from skimage import io,data
img=data.chelsea()
roi=img[80:180,100:200,:]
io.imshow(roi)
Para operar em vários pixels, use fatias de matriz para acessar. O método slicing retorna os valores de pixel do array acessado com o subscrito no intervalo especificado. Aqui estão alguns exemplos de imagens em tons de cinza:
img[i,:] = im[j,:] # 将第j行的数值赋值给第 i 行
img[:,i] = 100 # 将第i 列的所有数值设为 100
img[:100,:50].sum() # 计算前100行、前50列所有数值的和
img[50:100,50:100] # 50~100 行,50~100 列(不包括第100 行和第 100 列)
img[i].mean() # 第i行所有数值的平均值
img[:,-1] # 最后一列
img[-2,:] (or im[-2]) # 倒数第二行
Exemplo 5: Para ler a imagem do gatinho, primeiro
julgue todos os valores de pixel do componente vermelho, se for maior que 170, depois altere o valor de pixel deste local para [0,255,0], ou seja, o canal
G o valor é 255, o valor dos canais R e B é 0
from skimage import io,data
img=data.chelsea()
reddish = img[:,:, 0] >170
img[reddish] = [0,255, 0]
io.imshow(img)
4. Tipo de dados de imagem e conversão
No skimage, uma imagem é um array numpy simples.Existem muitos tipos de dados do array, e eles podem ser convertidos entre si. Esses tipos de dados e intervalos de valores são mostrados na tabela a seguir:
tipo de dados | Gamas |
---|---|
uint8 | 0~255 |
uint16 | 0 ~ 65535 |
uint32 | 0 ~2^32 |
flutuador | -1 ~ 1 ou 0 ~ 1 |
você8 | -128 ~ 127 |
int16 | -32768 ~ 32767 |
int32 | -2^31 ~ 2^31 - 1 |
O intervalo de valores de pixel de uma imagem em tons de cinza é [0,255], portanto, o tipo padrão é unit8 e o seguinte código pode ser usado para visualizar o tipo de dados:
from skimage import io,data
img=data.chelsea()
print(img.dtype.name)
Na tabela acima, preste atenção especial ao tipo float, e sua faixa está entre [-1,1] ou [0,1]. Depois que uma imagem colorida é convertida em uma imagem em tons de cinza, seu tipo muda de unit8 para float
1. Unidade8 para flutuar
from skimage import data,img_as_float
img=data.chelsea()
print(img.dtype.name)
dst=img_as_float(img)
print(dst.dtype.name)
saída
uint8
float64
2. flutuar para uint8
from skimage import img_as_ubyte
import numpy as np
img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)
dst=img_as_ubyte(img)
print(dst.dtype.name)
Saída:
float64
uint8
A conversão de float para unit8 pode causar perda de dados, então haverá um lembrete de aviso.
Exemplo 6: Binarize a imagem do café, o valor do pixel maior que 128 torna-se 1, caso contrário, torna-se 0
from skimage import io,data,color
img=data.coffee()
img_gray=color.rgb2gray(img)
rows,cols=img_gray.shape
for i in range(rows):
for j in range(cols):
if (img_gray[i,j]<=0.5):
img_gray[i,j]=0
else:
img_gray[i,j]=1
io.imshow(img_gray)
Este exemplo usa a função rgb2gray() do módulo de cores para converter uma imagem colorida em uma imagem em tons de cinza. O resultado da conversão é um array do tipo float64, e o intervalo está entre [0,1].
Além dessas duas conversões mais usadas, existem algumas outras conversões de tipo, conforme mostrado na tabela a seguir:
função | Função |
---|---|
img_as_float | Converter para ponto flutuante de 64 bits. |
img_as_ubyte | Converter para uint de 8 bits. |
img_as_int | Converter para inteiro de 16 bits. |
img_as_uint | Converter para uint de 16 bits. |