Basé sur cette idée (fig) entrez la description de l'image ici J'essaie de tracer toutes ces trois sorties (bords) dans une seule image avec des couleurs différentes pour représenter chacune (pas quelque chose comme une sous-intrigue ou un imshowpair). Encore maintenant, mes sorties ne sont que trois images différentes.entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

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
2
Bipul Mohanto 23 sept. 2018 à 14:23

1 réponse

Meilleure réponse

La solution originale que j'ai suggérée dans les commentaires était:

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

Cela donne une image dans laquelle les pixels vrais négatifs sont noirs :

enter image description here

(Veuillez pardonner la légende en haut, j'ai utilisé vos images et j'étais trop paresseux pour l'enlever.)

S'il y a une possibilité de chevauchement entre les trois images, c'est l'approche que j'utiliserais. Si vous voulez que TN soit blanc, au lieu d'ajouter les pixels au canal souhaité, vous pouvez les soustraire des deux autres canaux :

% 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)

Résultat:

enter image description here

Une autre possibilité est d'utiliser des images indexées comme vous l'avez fait à l'origine. La façon la plus propre de le faire est de générer les différents indices {1,2,3} dans une image fusionnée au sein de votre boucle, donc quelque chose comme ça dans votre dernière boucle (et un code similaire dans les deux autres):

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

Ensuite, à la fin, combinez les 3 couleurs en une seule palette de couleurs :

imshow(uint8(merged_image), 'ColorMap', [1 1 1; 0 1 0; 1 0 0; 0 0 1])
4
beaker 23 sept. 2018 à 21:07