Metoda e thjeshtë e zbulimit të skajeve në OpenCV Python

Duke përdorur në mënyrë efikase zbulimin e skajeve Canny

Zbulimi i skajeve është shumë i zakonshëm dhe i përdorur gjerësisht përpunimi i imazhit, i nevojshëm për shumë aplikacione të ndryshme të vizionit kompjuterik, si nxjerrja e të dhënave, segmentimi i imazhit dhe në nivel më të grimcuar nxjerrja e veçorive dhe njohja e modeleve. Redukton nivelin e zhurmës dhe numrin e detajeve në një imazh, por ruan strukturën e imazhit.

Zbulimi i skajeve në Python është një nga metodat më të njohura të zbulimit të skajeve në vizionin kompjuterik. Këto janë hapat për zbulimin e skajit Canny:

  1. Reduktimi i zhurmës duke përdorur zbutjen Gaussian
  2. Llogaritja e gradientëve
  3. Aplikimi i shtypjes jo-maksimale për të zvogëluar zhurmën dhe për të pasur vetëm maksimumin lokal në drejtim të gradientit
  4. Gjetja e pragut të sipërm dhe të poshtëm
  5. Zbatimi i pragut.

Fatmirësisht, biblioteka OpenCV ka funksionin cv2.canny() që kryen zbulimin e skajeve Canny për ne. Në këtë artikull, ne do të shkojmë drejtpërdrejt në kryerjen e zbulimit të skajeve duke përdorur OpenCV.

import cv2 
import matplotlib.pyplot as plt 

Ne do të përdorim foton e mëposhtme për tutorialin e sotëm:

Hapi i parë i zbulimit të Canny Edge ishte aplikimi i Gaussian Blur. Para se të turbulloni, është gjithashtu e rëndësishme të konvertoni imazhin në shkallë gri gjithashtu:

image = cv2.imread("meter.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

Tani, ne mund të aplikojmë drejtpërdrejt metodën tonë cv2.Canny() në këtë foto të paqartë. Është e thjeshtë. Duhen tre parametra: vetë imazhi, pragu i poshtëm dhe pragu i sipërm. Zgjedhja e këtyre pragjeve është e ndërlikuar. Për çdo imazh, këto pragje do të jenë të ndryshme.

Për këtë imazh, ne do të provojmë tre vargje të ndryshme dhe do të vëzhgojmë se çfarë ndodh:

wide = cv2.Canny(blurred, 50, 200)
mid = cv2.Canny(blurred, 30, 150)
tight = cv2.Canny(blurred, 210, 250)

Këtu kam përdorur tre lloje të ndryshme vargjesh. Në të gjerë, vlerat e pragut kanë një gamë të gjerë. Në mes, vlerat e pragut kanë diku në intervalin mesatar dhe në atë të ngushtë, vlerat e pragut kanë një gamë të ngushtë, vetëm 210 deri në 250, mjaft afër.

Për të kontrolluar imazhet, sapo ruajta këto tre imazhe (të gjera, të mesme dhe të ngushta).

Këto janë rezultatet:

Ky është rezultati i intervalit të mesëm:

Imazhi nga diapazoni i ngushtë:

Nëse vëmë re këto tre imazhe, besoj se intervali i mesëm dha një avantazh më të fortë.

Mbani mend, nuk mund t'i përgjithësoni këto vargje. Për një imazh të ndryshëm, një gamë e ndryshme mund të funksionojë. Kjo është arsyeja pse është kaq e ndërlikuar

Lajmi i mirë është se ekzistojnë disa truke statistikore që mund të përdoren për të gjetur pragun e poshtëm dhe të sipërm pa metodën e provës dhe gabimit që pamë më parë.

Ky është funksioni për zbulimin automatik të skajeve:

def auto_canny_edge_detection(image, sigma=0.33):
    md = np.median(image)
    lower_value = int(max(0, (1.0-sigma) * md))
    upper_value = int(min(255, (1.0+sigma) * md))
    return cv2.Canny(image, lower_value, upper_value)

Në funksionin e mësipërm, së pari gjendet vlera mesatare e pikselit nga grupi i imazhit. Pastaj duke përdorur këtë mesatare dhe një vlerë konstante sigma, mund të gjeni pragun e poshtëm dhe të sipërm. Këtu është përdorur një vlerë sigma prej 0.33. Në shumicën e aplikacioneve 0.33 funksionon si një vlerë sigma. Por në disa raste, nëse nuk ju jep një rezultat të mirë, provoni edhe ndonjë vlerë tjetër sigma.

Këtu është përdorimi i metodës auto_canny_edge_detection në imazhin e paqartë që krijuam më parë:

auto_edge = auto_canny_edge_detection(blurred)
cv2.imwrite("auto.jpg", auto_edge)

Kështu duket auto.jpg:

Siç mund ta shihni, avantazhi erdhi këtu mjaft qartë pa pasur nevojë të provoni shumë pragje.

konkluzioni

Sipas mendimit tim, funksioni automatik i zbulimit të skajeve na dha rezultatin më të mirë. Ju lutem mos ngurroni të provoni me aplikacionin tuaj. Mund të jetë shumë i dobishëm.

Më shumë Lexim