我有一张对比度非常低的图像,我想从中提取文本对象。由于它具有低对比度,我尝试了一些方法,但没有方法给我一个令人满意的结果。我使用watershed
来提取文本对象,但由于对比度差,因此提取不成功。
我watershed
的计划是:
I_cropped=imread(strcat('C:\Id\',currentfilename));
I_cropped = rgb2gray(I_cropped);
I_eq = histeq(I_cropped);
figure,imshow(I_eq);
bw = im2bw(I_eq, graythresh(I_eq));
bw2 = imfill(bw,'holes');
bw3 = imopen(bw2, ones(5,5));
bw4 = bwareaopen(bw3, 40);
bw = im2bw(I_eq, graythresh(I_eq));
figure,imshow(bw);
mask_em = imextendedmax(I_eq, 30);
mask_em = imclose(mask_em, ones(5,5));
mask_em = imfill(mask_em, 'holes');
mask_em = bwareaopen(mask_em, 40);
figure,imshow(mask_em);
I_eq_c = imcomplement(I_eq);
figure,imshow(I_eq_c);
I_mod = imimposemin(I_eq_c, ~bw4 | mask_em);
figure,imshow(I_mod);
L = watershed(I_mod);
figure,imshow(label2rgb(L));
我已应用laplacian
过滤器并增强优势,但效果不佳。
我的目标是提取文本对象。我应该尝试哪种方法来获得这种低对比度的图像?
附有图片:
答案 0 :(得分:1)
这是一种方法。
首先在图像上应用具有大内核的中值滤波器以移除异常值,然后应用阈值以转换为二进制图像。请注意,使用过滤器的内核大小来改变您需要使用的阈值级别。玩它来看输出变化。
然后反转图像并应用regionprops
来检测图像中的对象。之后用一点点数学推导出x和y原点(定义左上角)以及包围图像中所有字母的大边界框的宽度和长度。
以下是代码:
clear
clc
close all
Im = rgb2gray(imread('Imtext.png'));
%// Apply median filter to remove outliers
Im = medfilt2(Im,[9 9]);
%// Clear borders and apply threshold, then invert image
ImBW = imclearborder(~(im2bw(Im,.55)));
%// Find bounding boxes to delineate text regions.
S = regionprops(ImBW,'BoundingBox');
%// Concatenate all bounding boxes and obtain x,y, width and length of big
%// bounding box enclosing everything
bb = cat(1,S.BoundingBox);
LargeBB_x = min(bb(:,1));
LargeBB_y = min(bb(:,2));
LargeBB_height = max(bb(:,4));
%// Find last column in which pixel value is 1; that's the end
%// of the bounding box.
[~,ic] = find(ImBW==1);
MaxCol = max(ic(:));
LargeBB_width = MaxCol-LargeBB_x;
%// Display boxes
imshow(ImBW)
hold on
rectangle('Position',[LargeBB_x LargeBB_y LargeBB_width LargeBB_height],'EdgeColor','r','LineWidth',2)
hold off
输出:
或使用原始图片: