Как наложить более одной фигуры изображения на одну фигуру с помощью MATLAB? - PullRequest
0 голосов
/ 23 сентября 2018

Основываясь на этой идее (рис.) enter image description here Я пытаюсь отобразить все эти три выходных сигнала (ребра) в одном изображении с разными цветами для представления каждого (не что-то вроде субплота или пары imshowpair).).До сих пор мои выводы - это всего лишь три разных изображения. enter image description here enter image description here enter image description here

clear all
close all
clc
%% ground truth
img = imread('22o.jpg');
img_gray = rgb2gray(img);
img_ground_truth = imread('22g.jpg');
img_ground_truth = im2bw(img_ground_truth);
cc = img_ground_truth;
%cc = img_ground_truth(11:54, 112:171);

%% Detected part
img_edge = edge(img_gray, 'canny');
dd = img_edge;
%dd = img_edge(11:54, 112:171);

%% True pixel, false pixel, true negative 
[m n] = size(cc);
true_pixel = zeros(m,n);
false_pixel = zeros(m,n);
false_negative = zeros(m,n);
for i = 1:m
    for j = 1:n
        if (dd(i,j) == cc(i,j))
            true_pixel(i,j) = dd(i,j);          

        elseif (dd(i,j)~= cc(i,j))
            false_pixel(i,j) = dd(i,j);
        end
    end
end
for i = 1:m
    for j = 1:n
        if (cc(i,j)==1 && dd(i,j)==0)
            false_negative(i,j) = cc(i,j);
        end
    end
end
% subplot(2,3,1); imshow(cc); title('Gt');
% subplot(2,3,2); imshow(dd); title('Dc');
figure(1),imshow(true_pixel, 'ColorMap',[1 1 1;0 1 0]); 
title('True Pixel (TP)');
hold on
figure(2),imshow(false_pixel, 'ColorMap',[1 1 1;1 0 0]); 
title('False Pixel (FP)');
hold on
figure(3),imshow(false_negative, 'ColorMap',[1 1 1;0 0 1]); 
title('False Negative (FN)');
hold off

1 Ответ

0 голосов
/ 23 сентября 2018

Исходное решение, которое я предложил в комментариях, было:

merged_image = cat(3, false_pixel, true_pixel, false_negative);
imshow(merged_image)

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

enter image description here

(Пожалуйста, прости легенду вверху, я использовал твои изображения и мне было лень ее удалять.)

Если есть вероятность совпадения между тремя изображениями, этоподход я бы использовал.Если вы хотите, чтобы TN был белым, вместо добавления пикселей к нужному каналу вы можете вычесть их из двух других каналов:

% turn images into logical arrays to use in indexing
true_pixel = logical(true_pixel);
false_pixel = logical(false_pixel);
false_negative = logical(false_negative);

% create RGB channels for all-white image
r_channel = ones(size(true_pixel));
g_channel = ones(size(true_pixel));
b_channel = ones(size(true_pixel));

% leave pixels in true_pixel image green
r_channel(true_pixel) = 0;
b_channel(true_pixel) = 0;

% leave pixels in false_pixel image red 
g_channel(false_pixel) = 0;
b_channel(false_pixel) = 0;

% leave pixels in false_negative image blue
r_channel(false_negative) = 0;
g_channel(false_negative) = 0;

% merge into RGB image 
merged_image = cat(3, r_channel, g_channel, b_channel);
imshow(merged_image)

Результат:

enter image description here

Другая возможность - использовать проиндексированные изображения, как вы делали изначально.Самый простой способ сделать это - сгенерировать различные индексы {1,2,3} в объединенном изображении в вашем цикле, так что-то вроде этого в вашем последнем цикле (и аналогичный код в двух других):

...
false_negative(i,j) = cc(i,j);
merged_image(i,j) = cc(i,j)*3; 
...

Затем в конце объедините все 3 цвета в одну цветовую карту:

imshow(uint8(merged_image), 'ColorMap', [1 1 1; 0 1 0; 1 0 0; 0 0 1])
...