What does imhist do?

Guide til Billedhistogrammer i MATLAB med imhist

10/12/2013

Rating: 4.32 (16477 votes)

At forstå fordelingen af pixelværdier i et billede er en fundamental del af digital billedbehandling. Et af de mest kraftfulde værktøjer til dette formål er billedhistogrammet. Et histogram giver et hurtigt og visuelt overblik over et billedes tonale fordeling og kan afsløre vigtige egenskaber som lysstyrke og kontrast. I MATLAB gøres processen med at skabe disse histogrammer utroligt enkel takket være den indbyggede imhist-funktion. Denne artikel vil guide dig igennem alt, hvad du behøver at vide for at mestre beregningen og analysen af billedhistogrammer, uanset om du er nybegynder eller en erfaren bruger.

How does imhist calculate a histogram?
imhist(I) calculates the histogram for the grayscale image I. The imhist function returns the histogram counts in counts and the bin locations in binLocations. The number of bins in the histogram is determined by the image type. [counts,binLocations] = imhist(I,n) specifies the number of bins, n, used to calculate the histogram.
Indholdsfortegnelse

Hvad er et Billedhistogram?

Før vi dykker ned i MATLAB-koden, er det afgørende at forstå, hvad et billedhistogram egentlig repræsenterer. Forestil dig, at du tager hvert eneste pixel i et billede og sorterer det baseret på dets lysstyrke. Et histogram er simpelthen en grafisk repræsentation af denne sortering. Mere specifikt:

  • X-aksen repræsenterer intensitetsniveauerne. For et standard 8-bit gråtonebillede spænder dette fra 0 (helt sort) til 255 (helt hvidt).
  • Y-aksen repræsenterer antallet af pixels (frekvensen) for hvert specifikt intensitetsniveau på x-aksen.

Ved at analysere histogrammets form kan du drage vigtige konklusioner om billedet:

  • Et mørkt billede: Histogrammet vil have de fleste af sine data samlet i venstre side (lave intensitetsværdier).
  • Et lyst billede: Histogrammet vil være forskudt mod højre side (høje intensitetsværdier).
  • Et billede med lav kontrast: Histogrammet vil være samlet i et snævert område, hvilket indikerer, at der ikke er en stor spredning mellem de mørkeste og lyseste toner.
  • Et billede med høj kontrast: Histogrammet vil have en bred fordeling over hele intensitetsskalaen, hvilket viser en god repræsentation af både skygger, melle toner og højlys.

Denne indsigt er uvurderlig, når du skal beslutte, hvilke billedforbedringsteknikker der skal anvendes.

Introduktion til `imhist`-funktionen i MATLAB

MATLAB's Image Processing Toolbox tilbyder imhist-funktionen som det primære værktøj til at beregne og vise et billedes histogram. Dens grundlæggende syntaks er utrolig ligetil og kan håndtere forskellige billedtyper.

Den mest simple måde at bruge funktionen på er ved at give den et billede som input:

I = imread('pout.tif'); imhist(I);

Når denne kode køres, vil MATLAB automatisk beregne histogrammet for gråtonebilledet I og vise det i et nyt figurvindue. Som standard bruger imhist 256 'bins' (intervaller) for et 8-bit gråtonebillede (ét for hver mulig intensitetsværdi) og 2 bins for et binært billede (sort og hvidt).

Dybdegående Syntaks og Parametre

imhist-funktionen er fleksibel og tilbyder flere måder at tilpasse beregningen og outputtet på. Lad os se nærmere på de forskellige syntaksmuligheder.

Angivelse af antallet af 'bins'

Du kan specificere, hvor mange intervaller du vil opdele intensitetsskalaen i. Dette er nyttigt, hvis du ønsker et mere groft eller fintmasket overblik.

[counts, binLocations] = imhist(I, n);

Her specificerer n antallet af bins. For eksempel vil imhist(I, 64) opdele intensitetsområdet i 64 lige store intervaller og tælle antallet af pixels i hver.

Returnering af Histogramdata

Ofte vil du ikke kun se histogrammet, men også arbejde med selve dataene. Du kan få funktionen til at returnere tællingerne og bin-placeringerne.

[counts, binLocations] = imhist(I);
  • counts: En vektor, der indeholder antallet af pixels for hvert bin.
  • binLocations: En vektor, der indeholder intensitetsværdien for midten af hvert bin.

Med disse data kan du selv plotte histogrammet, for eksempel med stem- eller bar-funktionen, hvilket giver dig fuld kontrol over visualiseringen:

stem(binLocations, counts);

Histogram for Indekserede Billeder

For indekserede billeder, som bruger en farvepalette (colormap), kan imhist også bruges. Her viser histogrammet fordelingen af farveindekserne.

imhist(X, map);

Dette vil vise et histogram med et bin for hver farve i farvepaletten map.

Tabel over Syntaks-variationer

For at give et klart overblik er her en sammenligning af de mest almindelige måder at kalde imhist på:

SyntaksBeskrivelse
imhist(I)Viser et histogram for gråtone- eller binærbilledet I med standard antallet af bins (256 for uint8, 2 for logical).
imhist(I, n)Viser et histogram for billedet I ved hjælp af n specificerede bins.
[counts, x] = imhist(...)Returnerer histogramdataene i vektorerne counts (antal) og x (bin-placeringer) i stedet for at vise plottet direkte.
imhist(X, map)Viser et histogram for det indekserede billede X med farvepaletten map.

Anvendelse af Histogrammer til Billedforbedring

Den virkelige styrke ved histogrammer ligger i deres anvendelse til at guide billedforbedring. Når du har analyseret et billedes histogram, kan du træffe informerede beslutninger om, hvordan du justerer det.

Hvis histogrammet for eksempel viser, at alle pixelværdier er klemt sammen i et lille område (lav kontrast), kan du bruge teknikker til at strække histogrammet ud over hele det tilgængelige intensitetsområde. En af de mest kendte metoder til dette er histogramudligning (histogram equalization).

I MATLAB kan dette opnås med funktionen histeq:

I_enhanced = histeq(I);

Denne funktion omfordeler intensitetsværdierne, så det resulterende histogram bliver så fladt som muligt, hvilket typisk resulterer i en markant forbedring af billedets globale kontrast. Ved at sammenligne histogrammet før og efter histeq kan du visuelt se effekten af operationen.

Håndtering af Farvebilleder

Indtil nu har vi primært fokuseret på gråtoner. Men hvad med farvebilleder? Et standard RGB-farvebillede består af tre separate kanaler: Rød, Grøn og Blå. For at analysere et farvebillede skal du beregne et histogram for hver kanal separat.

Processen er som følger:

  1. Indlæs farvebilledet.
  2. Adskil de tre farvekanaler (R, G, B).
  3. Beregn histogrammet for hver kanal individuelt ved hjælp af imhist.

Her er et kodeeksempel, der viser, hvordan det gøres:

% 1. Indlæs farvebillede rgb_img = imread('peppers.png'); % 2. Adskil kanaler R = rgb_img(:,:,1); G = rgb_img(:,:,2); B = rgb_img(:,:,3); % 3. Beregn og plot histogrammer figure; hold on; imhist(R, 'Red'); imhist(G, 'Green'); imhist(B, 'Blue'); hold off; legend('Rød kanal', 'Grøn kanal', 'Blå kanal');

Ved at plotte de tre histogrammer oven på hinanden får du et detaljeret indblik i billedets farvebalance og fordeling.

Ofte Stillede Spørgsmål (FAQ)

Hvordan kan jeg gemme histogramgrafen som en billedfil?

Ja, efter at have genereret plottet i et figurvindue kan du bruge saveas-funktionen i MATLAB. For eksempel: saveas(gcf, 'mit_histogram.png') vil gemme den aktuelle figur (gcf = get current figure) som en PNG-fil.

Hvad indikerer et histogram, der er forskudt mod venstre?

Et histogram, der er stærkt forskudt mod venstre (mod de lave intensitetsværdier), indikerer, at billedet overvejende er mørkt. De fleste pixels har en lav pixelintensitet, hvilket resulterer i mange skyggeområder og få højlys.

Hvad er forskellen mellem `imhist` og `hist`?

imhist er specifikt designet til billeder i Image Processing Toolbox og tager højde for billeddatatyper (f.eks. uint8, uint16). Den vælger automatisk et passende antal bins baseret på datatypen. hist er en mere generel funktion i MATLAB til at skabe histogrammer for enhver form for numerisk data og kræver ofte, at du manuelt specificerer bin-kanterne.

Er det muligt at beregne histogrammer for forskellige billedformater?

Ja. MATLAB's imread-funktion understøtter en lang række billedformater, herunder JPEG, PNG, TIFF, BMP og mange flere. Så længe du kan indlæse billedet i MATLAB, kan du bruge imhist til at beregne dets histogram.

Konklusion

Beregning af billedhistogrammer er en fundamental færdighed inden for billedbehandling, og MATLAB's imhist-funktion gør processen både enkel og effektiv. Ved at forstå, hvordan man læser og fortolker et histogram, åbner du døren til en verden af avancerede billedanalyser og forbedringsteknikker. Fra simpel kontrastjustering til kompleks farvebalance er histogrammet dit vigtigste diagnostiske værktøj. Med den viden, du har fået i denne artikel, er du nu godt rustet til at anvende histogramanalyse i dine egne billedbehandlingsprojekter.

Hvis du vil læse andre artikler, der ligner Guide til Billedhistogrammer i MATLAB med imhist, kan du besøge kategorien Træ.

Go up