Histogram thresholding to get the threshold point
21 次查看(过去 30 天)
显示 更早的评论
hi,
I have been on image segmentation, till now I have divided image into two parts then I have taken histogram of those two parts, after substracting two histograms
- I needed to choose threshold Value?
- I want to compare each pixel value with threshold value of a zero matrix of same size as image
- and if threshold value is less than pixel value it woould be assigned 0
What have I done that is not correct upto some extent is given below
x=imread('tumor.jpg');
% im=rgb2gray(x);
im=x(:,:,1);
[q r]=size(im);
s=r/2;
for i=1:q
for j=1:s
%n1(i,j)=im(i,j);
end
end
for k=1:q
for m=s:r
% n2(k,m)=im(k,m);
end
end
if true
%code
n1 = im(:, 1 : end/2); %image(x,y,c) c is matrix displayed as image
n2 = im(:, end/2+1 : end );%indicate last array index
figure, imshow(n1)
figure, imshow(n2)
figure, imhist(n1)
figure, imhist(n2)
if true
%code
diff=imhist(n2)-imhist(n1);
figure, bar(diff,'r')
thresh_level = graythresh(diff); %find best threshold level
c=zeros(size(im));
[r c1] = size(im);
allpix=im(r, c1);
for i=1:r
for j=1:c1
if allpix(i,j)> thresh_level
c=255;
else
c=0;
end
end
end
figure, imshow(c)
end
0 个评论
采纳的回答
Image Analyst
2013-4-28
I can't understand any rationale for that algorithm. What do you think thresholding the difference of the histograms will get you? What do you even think the difference of the histograms represents? Where did you come up with such an algorithm?
Where did you upload your image?
3 个评论
Image Analyst
2013-4-28
Well I don't have access to that paper. Yes you can get bright objects from histogram thresholding, so for that, I agree with the paper's title. However I don't agree that taking the histogram of the right and left halves of the image, and then subtracting the histograms will get you anything worthwhile. And, of course you could easily make up some obvious counter examples, like a centered bright ball or square on a dark background. The histogram of both halves would be identical, and subtracing the histograms would give all zero, and you couldn't get any threshold at all. I submit that you have misunderstood the algorithm in the paper. But anyway, here is what I think you were trying to do:
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures if you have the Image Processing Toolbox.
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 20;
% Read in a standard MATLAB gray scale demo image.
folder = 'C:\Users\Mark\Documents\Temporary';
baseFileName = 'brain tumor.jpg';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% File doesn't exist -- didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image.
% numberOfColorBands should be = 1.
[rows, columns, numberOfColorBands] = size(grayImage);
if numberOfColorBands > 1
grayImage = rgb2gray(grayImage);
end
% Display the original gray scale image.
subplot(2, 3, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Give a name to the title bar.
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')
% Let's compute and display the histogram.
[pixelCount, grayLevels] = imhist(grayImage, 256);
subplot(2, 3, 4);
bar(pixelCount);
grid on;
title('Histogram of original image', 'FontSize', fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
% Extract left half and display histogram
middleColumn = floor(columns/2);
leftHalfImage = grayImage(:, 1:middleColumn);
subplot(2, 3, 2);
imshow(leftHalfImage, []);
title('left Half Image', 'FontSize', fontSize);
% Let's compute and display the histogram.
[pixelCountL, grayLevelsL] = imhist(leftHalfImage, 256);
subplot(2, 3, 5);
bar(pixelCountL);
grid on;
title('Histogram of left half image', 'FontSize', fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
% Extract right half and display histogram
middleColumn = floor(columns/2);
rightHalfImage = grayImage(:, middleColumn+1:end);
subplot(2, 3, 3);
imshow(rightHalfImage, []);
title('Right Half Image', 'FontSize', fontSize);
% Let's compute and display the histogram.
[pixelCountR, grayLevelsR] = imhist(rightHalfImage, 256);
subplot(2, 3, 6);
bar(pixelCountR);
grid on;
title('Histogram of right half image', 'FontSize', fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
% Now let's subtract the histograms (for some reason);
diffHistogram = int16(pixelCountL - pixelCountR);
% Display it
figure; % new figure
subplot(2, 2, 1);
bar(diffHistogram, 'BarWidth', 1);
title('Difference of Histograms', 'FontSize', fontSize);
% Now let's do an Otsu thresholding on it.
thresholdLevel = 255 * graythresh(diffHistogram) % Find Otsu threshold level
% Place vertical bar on histogram to show threshold
yl = ylim();
line([thresholdLevel, thresholdLevel], [yl(1), yl(2)], ...
'Color', 'r', 'LineWidth', 2);
grid on;
% Find pixels above the threshold
aboveThreshold = grayImage > thresholdLevel;
subplot(2, 2, 2);
imshow(aboveThreshold, []);
title('Above threshold', 'FontSize', fontSize);
But this is not a very robust algorithm at all. For one thing, it assumes that the image in a normal patient would be symmetrical about the center line. Also, as you can see there is a lot of "debris" in the image that is not the tumor. I can think of several very simple ways that would be better - more flexible and robust.
更多回答(2 个)
Iman Ansari
2013-4-28
Hi.
% code
x=imread('tumor.jpg');
% im=rgb2gray(x);
im=x(:,:,1);
[q r]=size(im);
s=r/2;
% for i=1:q
% for j=1:s
% %n1(i,j)=im(i,j);
% end
% end
% for k=1:q
% for m=s:r
% % n2(k,m)=im(k,m);
% end
% end
if true
%code
n1 = im(:, 1 : end/2); %image(x,y,c) c is matrix displayed as image
n2 = im(:, end/2+1 : end );%indicate last array index
figure, imshow(n1)
figure, imshow(n2)
figure, imhist(n1)
figure, imhist(n2)
if true
%code
diff=imhist(n2)-imhist(n1);
figure, bar(diff,'r')
thresh_level = graythresh(diff); %find best threshold level
c=zeros(size(im));
[r c1] = size(im);
allpix=im;
allpix(allpix>thresh_level*255)=255;
allpix(allpix<=thresh_level*255)=0;
c=allpix;
% for i=1:r
% for j=1:c1
% if allpix(i,j)> thresh_level
% c=255;
% else
% c=0;
% end
% end
% end
figure, imshow(c)
end
end
11 个评论
Image Analyst
2017-1-18
Take your output image use it as a mask and add something to it. Something like
shadows = output > 250; % Find white areas
grayImage(shadows) = grayImage(shadows) + 100; % Add 100 to shadow areas.
Or multiply by a factor
brightnessFactor = 1.5;
grayImage(shadows) = uint8(double(grayImage(shadows)) * brightnessFactor);
Alex Taylor
2016-11-7
编辑:Alex Taylor
2016-11-7
If you are trying to divide the 1-D feature space of grayscale values into 2 classes, that is exactly what the traditional Otsu thresholding algorithm does.
This algorithm is implemented in the MATLAB Image Processing Toolbox as greythresh:
This is the standard approach to global thresholding for binary image segmentation problems. I haven't looked at your paper.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Image Processing Toolbox 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!