Plot histogram of a series of images and extract cracks

1 次查看(过去 30 天)
Dear all,
I'm trying to plot histogram of a series of tomography images to assess the threshold for extracting cracks. I don't understand why the histogram is not displayed. I would like to select at least the first and the last images to determine the threshold. Here is the code:
Thanks a lot for any help
clear all
close all
clc
a= load('tomo_carota_8bit.mat')
x=a.x_8;
x=double(x);
% clear a
%%
figure,
for ii = 1:size(x, 3)
ii
I = squeeze(x(:,:,ii));
imshow(I, []);
pause(0.1)
end
subplot(3,2,1);
imshow(I,[]);
title('Original Grayscale Image', 'FontSize', 15);
subplot(3,2,2);
imhist(I);
title('Histogram of original image');
subplot(3,2,3);
imhist(I);
[counts, grayLevels] = imhist(I);
bar(grayLevels, counts, 'EdgeColor', 'r', 'FaceColor', 'b', 'BarWidth', 1);
xlim([0, max(I(:))]);
%xlim([0 100])
title('Histogram of original image zoomed');
subplot(3,2,4);
thresholdValue = 85;
thresholdValue1 = 60;
f.InvertHardcopy = 'off';
binaryImage1 = I > thresholdValue1;
imshow(binaryImage1, []);
title('Binary Image threshold 85');
f.InvertHardcopy = 'off';
binaryImage = I > thresholdValue;
subplot(3,2,5);
imshow(binaryImage, []);
title('Binary Image threshold 60');
figure (1)

采纳的回答

Ruchika Parag
Ruchika Parag 2024-7-17
Hi Elisa, it looks like you have a few issues in your code that might be causing the histogram not to be displayed properly. Here are some suggestions and corrections to help you plot the histogram of a series of tomography images effectively:
  1. Loop through images and plot histograms: Ensure that you are plotting the histogram for the first and the last images correctly.
  2. Clear previous figures: Use 'clf' to clear the current figure before plotting new images and histograms.
  3. Figure and subplot management: Make sure you create a new figure for each set of subplots to avoid overwriting.
Here is a modified version of your code:
clear all
close all
clc
a = load('tomo_carota_8bit.mat');
x = a.x_8;
x = double(x);
figure,
for ii = 1:size(x, 3)
I = squeeze(x(:, :, ii));
imshow(I, []);
pause(0.1)
end
figure;
I_first = squeeze(x(:, :, 1));
subplot(3, 2, 1);
imshow(I_first, []);
title('First Grayscale Image', 'FontSize', 15);
subplot(3, 2, 2);
imhist(I_first);
title('Histogram of first image');
subplot(3, 2, 3);
[counts, grayLevels] = imhist(I_first);
bar(grayLevels, counts, 'EdgeColor', 'r', 'FaceColor', 'b', 'BarWidth', 1);
xlim([0, max(I_first(:))]);
title('Histogram of first image zoomed');
I_last = squeeze(x(:, :, end));
subplot(3, 2, 4);
imshow(I_last, []);
title('Last Grayscale Image', 'FontSize', 15);
subplot(3, 2, 5);
imhist(I_last);
title('Histogram of last image');
subplot(3, 2, 6);
[counts, grayLevels] = imhist(I_last);
bar(grayLevels, counts, 'EdgeColor', 'r', 'FaceColor', 'b', 'BarWidth', 1);
xlim([0, max(I_last(:))]);
title('Histogram of last image zoomed');
thresholdValue1 = 60;
thresholdValue2 = 85;
figure;
binaryImage1 = I_first > thresholdValue1;
subplot(2, 2, 1);
imshow(binaryImage1, []);
title('Binary Image threshold 60 (First Image)');
binaryImage2 = I_first > thresholdValue2;
subplot(2, 2, 2);
imshow(binaryImage2, []);
title('Binary Image threshold 85 (First Image)');
binaryImage3 = I_last > thresholdValue1;
subplot(2, 2, 3);
imshow(binaryImage3, []);
title('Binary Image threshold 60 (Last Image)');
binaryImage4 = I_last > thresholdValue2;
subplot(2, 2, 4);
imshow(binaryImage4, []);
title('Binary Image threshold 85 (Last Image)');
By making these changes, you should be able to visualize the histograms of the first and last tomography images and determine the appropriate threshold for extracting cracks.
  1 个评论
Elisa
Elisa 2024-7-18
Dear Ruchika Parag, tahnk you very much for your help!!!!
i modified the code according to your suggestion and i also used a png image cause is more simple to be processed by my computer. Anyway, I tried so set thresholds without having the right final result. I would like to remove the black background at first, an then to extract cracks within the circle. Can you help me finding what is not working properly? I tried with circles2mask using imfindcircle at first, then i also tried to create a mask using a threshold for black pixels. here you can find the modified code:
clear all
close all
clc
A= imread('image_1567.png');
%% method 1
[centers,radii] = imfindcircles(A,[50 100],Sensitivity=0.9);
mask = circles2mask(centers,radii,size(A));
figure
montage({A,mask})
A(~(A == mask)) = nan
%% method 2
FG = fliplr(imadjust(I,[0.05 1]));
sout = size(I);
squaresize = [10 10];
xx = mod(0:(sout(2)-1),squaresize(2)*2)<squaresize(2);
yy = mod(0:(sout(1)-1),squaresize(1)*2)<squaresize(1);
BG = im2uint8(0.3 + bsxfun(@xor,xx,yy')*0.4);
mask = FG>10;
outpict = BG;
outpict(mask) = FG(mask);
outpict = uint8(double(FG).*mask + double(BG).*(1-mask));
subplot(3,2,1);
imshow(I,[]);
title('Original Grayscale Image', 'FontSize', 15);
subplot(3,2,2);
imhist(I);
title('Histogram of original image');
subplot(3,2,3);
imhist(outpict);
[counts, grayLevels] = imhist(outpict);
bar(grayLevels, counts, 'EdgeColor', 'r', 'FaceColor', 'b', 'BarWidth', 1);
xlim([0, max(outpict(:))]);
title('Histogram of output image with threshold 60');
subplot(3,2,4);
thresholdValue1 = 60;
f.InvertHardcopy = 'off';
binaryImage1 = outpict > thresholdValue1;
imshow(binaryImage1, []);
title('Binary Image threshold 60');
f.InvertHardcopy = 'off';
figure (1)

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Get Started with Image Processing Toolbox 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by