Может кто-нибудь объяснить мне, как этот код Matlab получает красный канал изображения? - PullRequest
0 голосов
/ 11 декабря 2011

вот код

  img = imread('imageName.jpg');
  redChannel = img(:,:,1);
  blackColor = zeros(size(redChannel));
  redImage = cat(3,redChannel,blackColor,blackColor);

я думаю, мы сначала читаем изображение и сохраняем его в переменной, а затем

мы знаем, что изображение будет иметь 3 размера 512x512x3

третье измерение связано с каналами

       1: red
       2: green
       3: blue

теперь переменная redChannel будет принимать красный канал изображения

, поэтому мой вопрос: почему не можетЯ просто использую

       image(redChannel)

, чтобы показать изображение?проблема в том, что он не показывает мне ничего, кроме красного цвета

, теперь он говорит:

        blackColor = zeros(size(redChannel));
        redImage = cat(3,redChannel,blackColor,blackColor);

черный цвет везде имеет нули, а его размер будет 512x512

который равен размеру каждого канала

о коте, я не понимаю, почему он это делает ....

1 Ответ

4 голосов
/ 11 декабря 2011

Давайте возьмем это изображение в качестве примера:

enter image description here

image(redChannel) отобразит красный канал, но усечет значения от 0 до 63. При использовании цветовой шкалы по умолчанию низкие значения будут синим, а высокие - красным. Ваша проблема в том, что все значения выше 63 представлены одним и тем же красным цветом:

enter image description here

imagesc(redChannel) будет делать то же самое, но масштабирует цветную полосу так, что синий цвет соответствует минимальным значениям redChannel, а красный - максимальным значениям (желто-зеленый - промежуточные значения):

enter image description here

imshow(redChannel) покажет вам красный канал, но в черном и белом (он не будет иметь артефакт 0-63):

enter image description here

image(redImage) покажет вам ту же информацию, но в черном и красном, вместо черного и белого. По сути, он удалил зеленую и синюю части в красном, поэтому у вас останется только красный канал, отображаемый красным. На самом деле image имеет другое поведение, когда вход имеет 1 канал или 3 канала. Когда он имеет один канал, он обрезает значения до 0-63 и отображает его с сине-красной цветовой полосой. Когда он имеет 3 канала, он отображает его в виде цветного изображения RGB:

enter image description here

Так в вашем случае:

   redImage = cat(3,redChannel,blackColor,blackColor);

redImage объединяет три канала. Для красного (первого) канала он помещает красный канал вашего входного изображения. Для зеленого и синего (второго и третьего) каналов ставятся только нули. В общем, redImage похоже на img, но зеленый и синий каналы установлены на ноль.

...