小白一个,刚开始学习数字图像处理,目前课程刚讲到直方图规定话,做作业过程中遇到问题,要求是匹配到高斯分布直方图,结果如下。
我是直接参照课本文字叙述编的代码,请各位大神帮帮小白
function I = matchgaussian(I,max1)
subplot(221);
imshow(I);
subplot(222);
histogram(I);
[row,col] = size(I);
pixels = row*col;
m = [pixels,1];
z = normrnd(128,35,m);
z = round(z);
[row1,col1] = size(z);
hist_gaussian = zeros(max1,1);
for i = 1:row1
if(1 <= z(i,1) && z(i,1) <= 256)
hist_gaussian(z(i,1),1) = hist_gaussian(z(i,1),1) + 1;
end
end
lut1 = I+1;
hist_org = makeHistogram(row,col,lut1,max1);
map_org = mapping(hist_org,pixels,max1);
map_gaussian = mapping(hist_gaussian,pixels,max1);
posibi_org = hist_org/pixels;
[map_new posibi_new] = gml(posibi_org,map_org,map_gaussian,max1);
for i = 1:row
for j = 1:col
if(map_new(I(i,j) + 1) < 20)
I(i,j) = (I(i,j) + 10)*4;
else
I(i,j) = map_new(I(i,j) + 1);
end
end
end
h = [1,2,1;2,4,2;1,2,1]/16;
I = filter2(h,I);
I = uint8(fix(I));
subplot(223);
imshow(I);
subplot(224);
histogram(I);
组映射
function [map_new posibi_new] = gml(posibi_org,map_org,map_spec,max1)
a = zeros(max1,1);
l = 0;
posibi_new = zeros(max1,1);
map_new = zeros(max1,1);
for i = 1:max1
if(abs(map_spec(i) - 1e-3) > 0)
a = a + map_spec(i);
[min1 posi_new] = min(abs(a - map_org));
a = zeros(max1,1);
if(l == 0)
map_new(posi_new) = i -1;
posibi_new(i) = posibi_org(posi_new);
posi_old = posi_new;
l = l+1;
else
if(abs(posi_new - posi_old) >= 1)
for j = posi_old + 1 : posi_new
map_new(j) = i-1;
posibi_new(i) = posibi_new(i) + posibi_org(j);
end
posi_old = posi_new;
else
;
end
end
end
end
如能解决,感激不尽。