Beeldverwerking zonder OpenCV | Python

| | | | | | | | | |

We weten dat OpenCV veel wordt gebruikt voor het werken met afbeeldingen en hiervoor een breed scala aan functies heeft. Maar wat als we afbeeldingsbestanden willen verwerken zonder een externe bibliotheek zoals OpenCV te gebruiken. Laten we eens kijken hoe we dat kunnen doen.

Beeldschaling (met behulp van naaste buur-interpolatie):

Nearest-buur-interpolatie — dit is de gemakkelijkste manier om te interpoleren. Deze methode bepaalt eenvoudig de "dichtstbijzijnde" aangrenzende pixel en neemt een waarde voor de intensiteit ervan.

Beschouw een kleine afbeelding waarvan de breedte w en de hoogte — h dat we willen veranderen van breedte p naar breedte q, ervan uitgaande dat p > m en q > N. Nu hebben we twee schaalconstanten nodig:

scale_x = p / w scale_y = q / h 

Nu herhalen we eenvoudig alle pixels in het uitvoerbeeld, verwijzend naar de originele pixels die we van kopiëren. onze controlevariabelen schalen met scale_x en scale_y, en de resulterende geschaalde indexwaarden afronden.

Visuele weergave:
De afbeelding is 3X3 pixels (9 pixels in totaal), als we nu de afbeeldingsgrootte willen vergroten tot 6X6, dan moeten volgens het dichtstbijzijnde aangrenzende algoritme 6/3 (dwz 2) pixels dezelfde RGB-waarde hebben als de waardepixel naar de originele afbeelding.

Beeldschalingsprogramma:


< /tbody>

# gebruik matplotlib en numpy

importeer matplotlib.image als img

import numpy as npy


# geef de locatie van de afbeelding leesbaar op

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


# definieert de lengte van de originele afbeelding

w , h = m.shape [: 2 ];


# xNew en yNew zijn de nieuwe breedte en
# afbeeldingshoogte vereist
na schalen

xNew = int (w * 1 / 2 );

yNew = int (h * 1 / 2 );


# bereken de schaalfactor
# werk meer dan 2 pixels

xScale = xNieuw / (w - 1 );

yScale = yNew / (h - 1 );


# gebruik numpy, waarbij de xNew-matrix wordt gebruikt
# breedte en nieuwe hoogte met
# 4 attributen [alpha, B, G, B] waarden ‚Äã‚Äã

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


voor i in bereik (xNew - 1 ):

for j in bereik (yNieuw - 1 ):

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

1 + int (j / yScale)]


# Afbeelding opslaan na schalen

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

Uitvoer:

De afbeelding in grijstinten:

Het gemiddelde gebruiken waardemethode, deze methode benadrukt de intensiteit van een pixel, in plaats van te laten zien uit welke RGB-waarden deze is samengesteld. Wanneer we de gemiddelde RGB-waarde berekenen en deze de RGB-waarde voor een pixel toewijzen, aangezien de RGB-waarde van de pixel hetzelfde is, kan deze geen kleur creëren, omdat alle kleuren worden gegenereerd vanwege een andere RGB-verhouding waarden, aangezien in dit geval de verhouding 1: 1: 1 zou zijn. Daarom ziet de gerenderde afbeelding eruit als een grijze afbeelding.

Visuele weergave:

Grijswaardenafbeeldingsprogramma:


# met NumPy

import numpy als npy


# met matplotlib

import matplotlib.image as img


# gebruik statistieken om gemiddelde te importeren
# om gemiddelde te berekenen

van statistieken import bedoel


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


# definieer de breedte en hoogte van de originele afbeelding

w, h = m .shape [: 2 ]


# nieuwe afbeeldingsdimensie met 4 attributen per pixel

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

print (w)

print (h)


voor i in bereik (w):

voor j in bereik (h):

# RGB-verhouding zal tussen 0 en 1 liggen

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

avg = float (gemiddelde (lst) )

newImage [i] [j] [ 0 ] = gemiddeld

newImage [i] [j] [ 1 ] = gem

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

newImage [i] [j] [ 3 ] = 1 # alfawaarde moet zijn 1


# Sla afbeelding op met imsave

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

Uitvoer:

Een afbeelding bijsnijden:

Bijsnijden verwijdert ongewenste pixel. Dit kan worden gedaan door de gewenste pixel in een ander raster van afbeeldingen te plaatsen, waarvan de grootte overeenkomt met de vereiste na het bijsnijden.

Beschouw een afbeelding met een grootte van 10 √ó 10 pixels, en als we willen alleen het midden van een afbeelding bijsnijden met een grootte van 4 √ó 4 pixels, dan moeten we pixelwaarden verzamelen ‚Äã‚Äãvan (10-4) / 2, beginnend bij (3, 3) tot 4 pixels in de x-richting en 4 pixels in de y-richting.

Visuele weergave:

Afbeelding bijsnijden:


# met matplotlib en numpy

import matplotlib.image als img

import numpy als npy


# lees afbeelding in variabele m

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


# definitie van afbeeldingsgrootte breedte (b) hoogte (h)

w, h = m.shape [: 2 ]


# vereiste afbeeldingsgrootte na bijsnijden

xNew = int (w * 1 / 4 )

yNew = int (h * 1 / 4 )

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


# print width source image height

print (w)

print (h)


voor i in bereik ( 1 , xNew):

voor j in bereik ( 1 , yNew):

# bijsnijden van 100 naar 100 pixels van de originele afbeelding

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


# sla de afbeelding op

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

Uitvoer:

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