matlab中图像局部增强
在冈萨雷斯的《数字图像处理》中看到过一种局部图像增强的方法,可以利用图像的局部信息对图像进行增强,之前一直想尝试一把,没能实现,现在有空搞了一下,代码如下% 局部增强法% Igray:灰度图像% k0,k1:可调参数% Ibw:提取得到数字区域function Ibw = LocalEnhance(Igray, k0, k1)masksize = 3; % 邻域范围,奇数exsize = floor(masksize/2); % 原图片需要填充的区域Iex = padarray(Igray, , 'replicate', 'both'); % 图片填充Is = zeros(size(Igray)); % 局部标准差for i = 1:size(Igray, 1)for j = 1:size(Igray, 2)subdomain = Iex(i:i+2*exsize, j:j+2*exsize);localmean = sum(subdomain(:))/masksize^2;Is(i, j) = sqrt(sum((subdomain(:)-localmean).^2))/masksize;endend% 确定不同区域的放大系数meanIm = mean(Igray(:));minIm = min(Igray(:));meanIs = mean(Is(:));maxIs = max(Is(:));Im1 = Igray<(minIm+k0*(meanIm-minIm)); % 均值阈值提取Is1 = Is>(meanIs + k1*(maxIs-meanIs)); % 标准差阈值提取s = strel('disk',8); % 8需要根据实际图片大小来调Is1 = imclose(Is1, s); % 标准差阈值提取闭运算Ibw = Im1 & Is1; % 局部增强end 对一张图片做测试的效果如下 单纯使用大津法动态阈值二值化 局部增强法得到数字区域 为什么能得到这样的效果呢,从局部标准差就能看出来背景部分灰度过渡缓慢,标准差小,而数字部分,尤其边界,灰度变化大,标准差大,从而能很好的剔除背景部分。 上面的循环部分还是比较耗时间的,可以用c实现,matlab编译后使用,应该会极大提高速度,毕竟matlab在循环上还是远不如c的。转自:http://blog.sina.com.cn/s/blog_6163bdeb0102e8pp.html
页:
[1]