Processamento de imagem Python II: acesso e tipos de dados de pixels de imagem

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.

Acho que você gosta

Origin blog.csdn.net/weixin_52051554/article/details/127486378
Recomendado
Clasificación