Отображение площади объекта в оттенках серого по сравнению с уровнем его интенсивности на изображении в оттенках серого

В основном то, что я пытаюсь создать, - это гистограмма изображения с различной интенсивностью оттенков серого, показывающая мне область связанных компонентов на изображении.

Позвольте мне объяснить дальше, я планирую найти области всех связанных компонентов изображения при различных пороговых уровнях. Затем объедините их все графическим способом и покажите их в зависимости от уровня интенсивности изображения в градациях серого, то есть 0 - 255.

Надеюсь, мой код объяснит, что я пытаюсь сделать.

img = rgb2gray(imread('W1\Writer1_01_02.jpg'));

for k = 1:-0.01:0.1
     bw_normal = im2bw(img, k);
     bw = imcomplement(bw_normal);
     [label,n] = bwlabel(bw);
     stats = regionprops(label,img, {'Area', 'Centroid'});
      plot([stats.Area],k,'o');
      axis([0 1000 0.1 1])

     hold on;
     
 end

Как вы можете сказать, я использовал цикл for для получения переменного порогового уровня, вычисления площадей CC и построения их графика относительно выбранного порогового уровня. Вот что он производит:

введите описание изображения здесь

это не то, что я хочу. Я пытаюсь воспроизвести этот результат. Это не обязательно должно выглядеть точно так, но что-нибудь похожее подойдет.

введите описание изображения здесь

Затем я обнаружил, что могу найти свойства CC из изображения в градациях серого напрямую, используя STATS = regionprops(..., I, properties)

Итак, я написал это:

img = rgb2gray(imread('W1\Writer1_01_02.jpg'));

for k = 1:-0.01:0.1
     bw_normal = im2bw(img, k);
     bw = imcomplement(bw_normal);
     [label,n] = bwlabel(bw);
     stats = regionprops(label,img, {'Area', 'Centroid'});
%       plot([stats.Area],k,'o');
%       axis([0 1000 0.1 1])
      imshow(img);
     hold on;
     for j = 1:numel(stats)
         text(stats(j).Centroid(1),stats(j).Centroid(2), ...
        sprintf('%2.1f', stats(j).Area), ...
        'EdgeColor','b','Color','r');
     end
     
 end

Это привело к следующему:

введите описание изображения здесь

Итак, теперь я нашел области связанных компонентов в оттенках серого. Как мне построить их так, чтобы они отображались как желаемый результат (синий, который я показал выше)?

Спасибо за чтение


person StuckInPhDNoMore    schedule 12.02.2014    source источник
comment
Можете ли вы сделать доступными ваши необработанные данные. Если я собираюсь посмотреть на код, чтобы чего-то достичь, наличие фактических входных данных для работы может обеспечить более качественный результат.   -  person EngrStudent    schedule 13.02.2014
comment
Спасибо. Никаких конкретных данных не требуется. Подойдет любое текстовое изображение. Как изображение, которое я показал в конце.   -  person StuckInPhDNoMore    schedule 13.02.2014
comment
Я думаю, для каждого уровня шкалы серого вам нужно извлечь список всех значений Area и построить из них гистограмму (используя согласованные значения ячеек). Каждая строка на этой карте ширины будет гистограммой для отдельного порогового уровня.   -  person nkjt    schedule 13.02.2014
comment
@nkjt Можете ли вы добавить ответ, содержащий код, о том, как это будет выполнено. То, что вы сказали, похоже, дает желаемый результат, но я не знаю, как построить гистограмму так, как вы объяснили. Спасибо   -  person StuckInPhDNoMore    schedule 13.02.2014


Ответы (1)


На основе вашего существующего кода:

img = rgb2gray(imread('W1\Writer1_01_02.jpg'));
k = 1:-0.01:0.1;
bins = 1:100 % change depending on your image

% preallocate output - this will be filled with histograms
histout = zeros(length(k),length(bins); 

for m = 1:length(k); 
     bw_normal = im2bw(img, k(m));
     bw = imcomplement(bw_normal);
     [label,n] = bwlabel(bw);
     stats = regionprops(label,img, {'Area'});
     A = cell2mat(struct2cell(stats));
     histout(m,:) = hist(A,bins);
end

Я изменил вывод regionprops на просто Area, потому что он упрощает преобразование выходной структуры во что-то, что может быть прочитано hist. Переход от цикла через k к предопределению вектора k и использованию k(m) в цикле просто упрощает индексацию в histout.

Вы можете отобразить с помощью imagesc, а затем исправить метку галочки:

imagesc(histout)
colormap('jet')
set(gca,'XTickLabel',bins(get(gca,'XTick')));
set(gca,'YTickLabel',k(get(gca,'YTick')));
xlabel('Area')
ylabel('Threshold')
person nkjt    schedule 13.02.2014