MATLAB Language
Afbeelding verwerken
Zoeken…
Basisafbeelding I / O
>> img = imread('football.jpg');
Gebruik imread
om afbeeldingsbestanden in een matrix in MATLAB te lezen.
Nadat u een afbeelding hebt imread
, wordt deze opgeslagen als een ND-array in het geheugen:
>> size(img)
ans =
256 320 3
De afbeelding 'football.jpg'
heeft 256 rijen en 320 kolommen en heeft 3 kleurkanalen: rood, groen en blauw.
Je kunt het nu spiegelen:
>> mirrored = img(:, end:-1:1, :); %// like mirroring any ND-array in Matlab
En ten slotte, schrijf het terug als een afbeelding met imwrite
:
>> imwrite(mirrored, 'mirrored_football.jpg');
Afbeeldingen ophalen van internet
Zolang u een internetverbinding hebt, kunt u afbeeldingen van een hyperlink lezen
I=imread('https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png');
Filteren met een 2D FFT
Net als voor 1D-signalen, is het mogelijk om afbeeldingen te filteren door een Fourier-transformatie toe te passen, te vermenigvuldigen met een filter in het frequentiedomein en terug te transformeren naar het ruimtedomein. Hier ziet u hoe u hoog- of laagdoorlaatfilters kunt toepassen op een afbeelding met Matlab:
Laat image
de originele, ongefilterde afbeelding zijn, hier is hoe de 2D FFT te berekenen:
ft = fftshift(fft2(image));
Om een deel van het spectrum uit te sluiten, moet je de pixelwaarden op 0 zetten. De ruimtelijke frequentie in het oorspronkelijke beeld wordt vanuit het midden naar de randen toegewezen (na gebruik van fftshift
). Om de lage frequenties uit te sluiten, stellen we het centrale cirkelvormige gebied in op 0.
U kunt als volgt een schijfvormig binair masker met straal D
genereren met de ingebouwde functie:
[x y ~] = size(ft);
D = 20;
mask = fspecial('disk', D) == 0;
mask = imresize(padarray(mask, [floor((x/2)-D) floor((y/2)-D)], 1, 'both'), [x y]);
Het maskeren van het frequentiedomeinbeeld kan worden gedaan door de FFT puntsgewijs te vermenigvuldigen met het hierboven verkregen binaire masker:
masked_ft = ft .* mask;
Laten we nu de inverse FFT berekenen:
filtered_image = ifft2(ifftshift(masked_ft), 'symmetric');
De hoge frequenties in een afbeelding zijn de scherpe randen, dus dit high-pass filter kan worden gebruikt om afbeeldingen te verscherpen.
Afbeelding filteren
Laten we zeggen dat u een afbeelding rgbImg
bijvoorbeeld is ingelezen met imread
.
>> rgbImg = imread('pears.png');
>> figure, imshow(rgbImg), title('Original Image')
Gebruik fspecial
om een 2D-filter te maken:
>> h = fspecial('disk', 7);
>> figure, imshow(h, []), title('Filter')
Gebruik imfilter
om het filter op de afbeelding toe te passen:
>> filteredRgbImg = imfilter(rgbImg, h);
>> figure, imshow(filteredRgbImg), title('Filtered Image')
Eigenschappen van verbonden regio's meten
Beginnend met een binaire afbeelding, bwImg
, die een aantal verbonden objecten bevat.
>> bwImg = imread('blobs.png');
>> figure, imshow(bwImg), title('Binary Image')
Gebruik regionprops
om eigenschappen (bijvoorbeeld gebied, zwaartepunt, enz.) Van elk object in de afbeelding te meten:
>> stats = regionprops(bwImg, 'Area', 'Centroid');
stats
is een struct-array die een struct bevat voor elk object in de afbeelding. Toegang tot een gemeten eigenschap van een object is eenvoudig. Als u bijvoorbeeld het gebied van het eerste object wilt weergeven,
>> stats(1).Area
ans =
35
Visualiseer de centroïden van het object door ze op de oorspronkelijke afbeelding te leggen.
>> figure, imshow(bwImg), title('Binary Image With Centroids Overlaid')
>> hold on
>> for i = 1:size(stats)
scatter(stats(i).Centroid(1), stats(i).Centroid(2), 'filled');
end