Processamento de imagem sem OpenCV | Pitão

| | | | | | | | | |

Sabemos que o OpenCV é amplamente utilizado para trabalhar com imagens e possui uma ampla gama de funções para isso. Mas e se quisermos processar arquivos de imagem sem usar nenhuma biblioteca externa como o OpenCV. Vamos ver como podemos fazer isso.

Escala de imagem (usando interpolação do vizinho mais próximo):

Interpolação do vizinho mais próximo — esta é a maneira mais fácil de interpolar. Este método simplesmente determina o pixel vizinho "mais próximo" e assume um valor para sua intensidade.

Considere uma pequena imagem cuja largura é w e a altura é — h que queremos mudar de largura p para largura q, assumindo p > m e q > n. Agora precisamos de duas constantes de escala:

scale_x = p / w scale_y = q / h 

Agora simplesmente iteramos sobre todos os pixels na imagem de saída, referindo-se aos pixels originais que estão copiando. dimensionando nossas variáveis de controle com scale_x e scale_y e arredondando os valores de índice dimensionados resultantes.

Representação visual:
A imagem tem 3X3 pixels (9 pixels no total), agora se quisermos aumentar o tamanho da imagem para 6X6, então, de acordo com o algoritmo vizinho mais próximo, 6/3 (ou seja, 2) pixels devem ter o mesmo valor RGB que o valor do pixel para a imagem original.

Programa de dimensionamento de imagem:


< /tbody>

# usando matplotlib e numpy

import matplotlib.image as img

importar numpy as npy


# fornece a localização da imagem legível

m = img.imread ( "taj.png " );


# definindo o comprimento da imagem original

w , h = m.shape [: 2 < classe de código = "simples">];


# xNew e yNew são a nova largura e
# altura da imagem necessária
após dimensionar

xNew = int (w * 1 / 2 );

yNew = int (h * 1 / 2 );


# calcular o fator de escala
# trabalhar mais de 2 pixels

xScale = xNew / (w - 1 );

yScale = yNew / (h - 1 );


# usando numpy, pegando a matriz xNew
# largura e nova altura com
# 4 atributos [alpha, B, G, B] valores ‚Äã‚Äã

newImage = npy.zeros ([xNew, yNew, 4 ]);


para i em intervalo (xNew - 1 ):

for j em intervalo (yNew - 1 ):

newImage [ i + 1 , j + 1 ] = m [ 1 + int (i / xScale),

1 + int (j / yScale)]


# Salva a imagem após dimensionar

img.imsave ( `scaled.png ` , novaImagem);

Saída:

Escala de cinza da imagem:

Usando a média value, esse método enfatiza a intensidade de um pixel, em vez de mostrar de que valores RGB ‚Äã‚Äãé composto. Quando calculamos o valor RGB médio e atribuímos o valor RGB para um pixel, já que o valor RGB do pixel é o mesmo, não será possível criar nenhuma cor, pois todas as cores são geradas devido a uma proporção diferente de RGB valores, pois neste caso a proporção seria 1:1:1. Portanto, a imagem renderizada parecerá uma imagem cinza.

Representação visual:

Programa de imagem em tons de cinza:


# usando NumPy

import numpy como npy


# usando matplotlib

import matplotlib.image as img


# usa estatísticas para importar a média
# para calcular a média

from estatísticas importação significa


m = img.imread ( "taj.png" )


# define a largura e altura do imagem original

w, h = m .shape [: 2 ]


# nova dimensão de imagem com 4 atributos por pixel

newImage = npy.zeros ([w, h, 4 ])

print (w)

print (h)


para i em intervalo (w):

para j em intervalo (h):

# proporção RGB será entre 0 e 1

lst = [ float (m [i] [j] [ 0 ]), float (m [i] [j] [ 1 ]), float (m [i] [j] [ 2 ])]

avg = float (mean (lst) )

newImage [i] [j] [ 0 ] = avg

newImage [i] [j] [ 1 ] = avg

newImage [i] [j] [ 2 ] = avg

newImage [i] [j] [ 3 ] = 1 # valor alfa deve ser 1


# Salva imagem com imsave

img.imsave ( `grayedImage.png` , newImage)

Saída:

Cortar uma imagem:

Cortar basicamente remove pixel indesejado. Isso pode ser feito colocando o pixel necessário em outra grade de imagens, cujo tamanho corresponda ao necessário após o corte.

Considere uma imagem com tamanho de 10 √ó 10 pixels, e se queremos apenas recortar o centro de uma imagem com tamanho de 4 √ó 4 pixels, então precisamos coletar valores de pixel ‚Äã‚Äãde (10-4) / 2, começando em (3, 3) até 4 pixels na direção x e 4 pixels na direção y.

Representação visual:

Cortador de imagem:


# usando matplotlib e numpy

import matplotlib.image as img

import numpy as npy


# lê a imagem na variável m

m = img.imread ( "taj.png" )


# definição do tamanho da imagem largura (w) altura (h)

w, h = m.shape [: 2 ]


# tamanho da imagem necessária após o corte

xNew = int (w * 1 / 4 )

yNew = int (h * 1 / 4 )

newImage = npy.zeros ([xNew, yNew, 4 ])


# largura de impressão altura da imagem de origem

print (w)

print (h)


para i em intervalo ( 1 , xNew):

for j em intervalo ( 1 , yNew):

# recorte de 100 a 100 pixels da imagem original

newImage [i, j] = m [ 100 + i, 100 + j]


# salve a imagem

img.imsave ( `cropped.png` , newImage)

Saída:

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method