2014-02-12 3 views
1

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

Позвольте пояснить далее, я планирую найти области всех подключенных компонентов изображения на , изменяя пороговые уровни. Затем объедините их все графически и покажите, как они построены на фоне уровня интенсивности изображения в оттенках серого, то есть 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 

Как вы можете сказать, что я использовал цикл для получения изменяющегося порогового уровня, вычислить области ЦК и построить их против выбранного порогового уровня. Это то, что она производит:

enter image description here

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

enter image description here

Я тогда узнал, что я могу найти свойства 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 

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

enter image description here

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

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

+0

вы можете сделать ваши исходные данные. Если я собираюсь взглянуть на код, чтобы что-то сделать, наличие фактических входных данных для работы может обеспечить более высокое качество вывода. – EngrStudent

+0

Спасибо. Никаких конкретных данных не требуется. Любое текстовое изображение будет делать. Как и изображение, которое я показал в конце. – StuckInPhD

+0

Я думаю, что для каждого уровня шкалы серого вам нужно извлечь список всех значений «Area» и построить из них гистограмму (используя согласованные значения bin). Каждая строка в этой «карте ширины» будет гистограммой для отдельного порогового уровня. – nkjt

ответ

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