Chcę załadować obraz RGB w MATLAB i przekształcić go w obraz binarny, w którym mogę wybrać, ile pikseli ma obraz binarny. Na przykład ładowałbym obraz 300x300 png/jpg do MATLAB i otrzymałbym obraz binarny (piksele mogą mieć tylko #000 lub #FFF), który może mieć 10x10 pikseli.

Oto, czego do tej pory próbowałem:

load trees % from MATLAB
gray=rgb2gray(map); % 'map' is loaded from 'trees'. Convert to grayscale.
threshold=128;
lbw=double(gray>threshold);
BW=im2bw(X,lbw); % 'X' is loaded from 'trees'.
imshow(X,map), figure, imshow(BW)

(Mam niektóre z powyższych z wyszukiwania w Internecie.)

Po prostu kończę z czarnym obrazem, kiedy robię imshow(BW).

4
gosr 29 sierpień 2012, 19:39

2 odpowiedzi

Najlepsza odpowiedź

Pierwszym problemem jest to, że mylisz zindeksowane obrazy (które mają mapę kolorów map) i Obrazy RGB (które nie). Przykładowy obraz wbudowany trees.mat, który ładujesz w swoim przykładzie, jest obrazem indeksowanym i dlatego powinieneś użyć funkcji ind2gray, aby najpierw przekonwertować go na obraz o intensywności w skali szarości. W przypadku obrazów RGB funkcja rgb2gray zrobi to samo .

Następnie musisz określić próg, który będzie używany do konwersji obrazu w skali szarości na obraz binarny. Proponuję funkcję graythresh, która obliczy próg podłączenia do im2bw (lub nowszego < a href="https://www.mathworks.com/help/images/ref/imbinarize.html" rel="nofollow noreferrer">imbinarize). Oto jak mógłbym osiągnąć to, co robisz na twoim przykładzie:

load trees;             % Load the image data
I = ind2gray(X, map);   % Convert indexed to grayscale
level = graythresh(I);  % Compute an appropriate threshold
BW = im2bw(I, level);   % Convert grayscale to binary

A oto jak wygląda oryginalny obraz i wynik BW:

enter image description here

enter image description here

W przypadku wejścia obrazu RGB po prostu zamień ind2gray na rgb2gray w powyższym kodzie.

Jeśli chodzi o zmianę rozmiaru obrazu, można to łatwo zrobić za pomocą funkcji Image Processing Toolbox imresize, na przykład:

smallBW = imresize(BW, [10 10]);  % Resize the image to 10-by-10 pixels
8
gnovice 29 sierpień 2017, 07:42

Dzieje się tak, ponieważ gray jest w skali [0,1], podczas gdy threshold jest w [0,256]. Powoduje to, że lbw jest dużą tablicą false. Oto zmodyfikowany kod, który rozwiązuje problem:

load trees % from MATLAB
gray=rgb2gray(map); % 'map' is loaded from 'trees'. Convert to grayscale.
threshold=128/256;
lbw=double(gray>threshold);
BW=im2bw(X,lbw); % 'X' is loaded from 'trees'.
imshow(X,map), figure, imshow(BW)

A wynik jest taki:

enter image description here

0
Andrey Rubshtein 29 sierpień 2012, 19:50