马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
在冈萨雷斯的《数字图像处理》中看到过一种局部图像增强的方法,可以利用图像的局部信息对图像进行增强,之前一直想尝试一把,没能实现,现在有空搞了一下,代码如下 % 局部增强法 % Igray:灰度图像 % k0,k1:可调参数 % Ibw:提取得到数字区域 function Ibw = LocalEnhance(Igray, k0, k1) masksize = 3; % 邻域范围,奇数 exsize = floor(masksize/2); % 原图片需要填充的区域 Iex = padarray(Igray, [exsize exsize], '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; end end % 确定不同区域的放大系数 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的。
|