53 lines
1.3 KiB
Plaintext
53 lines
1.3 KiB
Plaintext
function h = imagehistogram(imago)
|
|
if ( isgray(imago) )
|
|
for j = 0:255
|
|
h(j+1) = numel(imago( imago == j ));
|
|
endfor
|
|
else
|
|
error("histogram on gray img only");
|
|
endif
|
|
endfunction
|
|
|
|
% test
|
|
im = jpgread("Lenna100.jpg");
|
|
img = rgb2gray(im);
|
|
h = imagehistogram(img);
|
|
% let's try to show the histogram
|
|
bar(h);
|
|
pause;
|
|
|
|
% in order to obtain the requested filtering, we
|
|
% can use median directly on the img, and then
|
|
% use that value, this way:
|
|
m = median(reshape(img, 1, numel(img)));
|
|
disp(m);
|
|
ibw = img;
|
|
ibw( img > m ) = 255;
|
|
ibw( img <= m ) = 0;
|
|
jpgwrite("lennamed_.jpg", ibw, 100);
|
|
% which disagree (128) with the m computed with histog_med (130).
|
|
% If we compute it this way:
|
|
% m = sort(reshape(img, 1, numel(img)))(ceil(numel(img)/2));
|
|
% we obtain 130... but builtin median works as expected, since
|
|
% N (number of pixel of Lenna) is even, not odd.
|
|
|
|
% but let's use our histogram h instead
|
|
function m = histog_med(histog)
|
|
from = 0; to = 255;
|
|
left = histog(from + 1); right = histog(to+1);
|
|
while ( from != to )
|
|
if ( left < right )
|
|
from++; left += histog(from+1);
|
|
else
|
|
to--; right += histog(to+1);
|
|
endif
|
|
endwhile
|
|
m = from;
|
|
endfunction
|
|
|
|
m = histog_med(h);
|
|
disp(m);
|
|
ibw( img > m ) = 255;
|
|
ibw( img <= m ) = 0;
|
|
jpgwrite("lennamed.jpg", ibw, 100);
|