POSHE 算法

 ---来自百度,收藏
POSHE 算法是在输入图像上定义一矩形子块,利用该子块图像的直方图信息对子块的所有像素进行直方图均衡化,将子块以一定的步长移动并重复以上处理过程,直至遍历输入图像的所有像素,对多次被均衡的像素,将均衡结果取平均作为该像素在输出图像中的灰度值。

下面的程序如何修改能够达到部分重叠的效果,图像运行后的白色的
clear;close all;clc;
 str = 'lena.bmp';
 I = imread(str);
 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,:) ;img; img(end-1:-1:end-len,:)];
    [h w] = size(img);
    med_out(:,:,k) = zeros(h,w);
    counts = zeros(h,w);
    for i =1:hstep:h
        if h-i >= len
            for j = 1:wstep:w
                if w-j >= len 
                    rect =histeq(img(i:i+len-1,j:j+len-1));%把图像块进行抛物线直方图均衡
                    med_out(i:i+len-1,j:j+len-1,k) = uint8(med_out(i:i+len-1,j:j+len-1,k))+rect;
                    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) = med_out(len+1:end-len-1,len+1:end-len-1,k);
    med_out1(:,:,k) = med_out1(:,:,k)./counts(len+1:end-len-1,len+1:end-len-1);
    out(:,:,k) = med_out1(:,:,k);
end
figure,imshow(out),title('poshe result');
2011-4-18 13:11
最佳答案
clear;
 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,:) ;img; img(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');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
这样改就可以了,运行后可以出结果,图片就不贴了!!
编程时要考虑数据范围是否过界的问题。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值