I = imread('E:\ebook\lena.bmp')
figure,imshow(I),title('original image')
len = 5
hstep = 2
wstep = 2
for k = 1:size(I,3)
img = I(:,:,k)
img = [img(:,len:-1:2) img img(:,end-1:-1:end-len)]
img = [img(len:-1:2,:) imgimg(end-1:-1:end-len,:)]%%其实就是图像扩展,参考wextend函数,当然你的方法也可以
[h w] = size(img)
med_out(:,:,k) = int16(zeros(h,w))%%转化成int16型数据,原因下面会说明
counts = zeros(h,w)
for i =1:hstep:h
if h-i >= len
for j = 1:wstep:w
if w-j >= len
rect =int16(histeq(img(i:i+len-1,j:j+len-1)))%同样转化成int16类型
med_out(i:i+len-1,j:j+len-1,k) =med_out(i:i+len-1,j:j+len-1,k)+rect%%rect和med_out转化成int16类型原因在于,你的med_out计算直方图均衡化并且把重复的像素的直方图均衡化结果进行累加,那么其累加的值很有可能超过255,所以你转化med_out为uint8型是不够的,它会把超过255的值强制为255。
counts(i:i+len-1,j:j+len-1) = counts(i:i+len-1,j:j+len-1)+1
end
end
end
end
med_out1(:,:,k) = double(med_out(len:end-len,len:end-len,k))%%这里对图像两边各扩展了四个像素,所以起始位置应该是len,而不是len+1,同样结束就是end-len
med_out1(:,:,k) = med_out1(:,:,k)./counts(len:end-len,len:end-len)
out(:,:,k) = uint8(med_out1(:,:,k))%%转化成uint8型
end
figure,imshow(out),title('poshe result')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
这样改就可以了,运行后可以出结果,图片就不贴了!!
编程时要考虑数据范围是否过界的问题。
直方图均衡化是专门对于灰度图像而言的处理算法,所以你得先转化为灰度图像,具体程序如下: a=imread('e:\b.jpg')%读取图像 b=rgb2gray(a)%转化为灰度图像 imshow(b)%显示原图 c=histeq(b)%直方图均衡化 subplot(121),imshow(a)subplo欢迎分享,转载请注明来源:内存溢出
评论列表(0条)