我有一份文件图片,可能是报纸或杂志。例如,扫描的报纸。我想删除所有/大多数文本并将图像保留在文档中。有谁知道如何检测文档中的文本区域?以下是一个例子。提前谢谢!
答案 0 :(得分:2)
通常的物体识别模式可以在这里工作 - 阈值,检测区域,过滤区域,然后对剩余的区域做你需要的。
这里的阈值很容易。背景是纯白色(或者可以过滤为纯白色),因此在反转灰度图像中高于0的任何内容都是文本或图像。然后可以在该阈值化的二值图像中检测区域。
为了过滤区域,我们只需要确定文本与图片的不同之处。文本区域将变小,因为每个字母都是自己的区域。相比之下,图片是大区域。使用适当的阈值按区域区域过滤将拉出所有图片并删除所有文本,假设图片中没有任何图片大小与页面上任何位置的单个字母大小相同。如果是,那么可以使用其他过滤标准(饱和度,色调差异......)。
一旦按区域和饱和度标准过滤区域,则可以通过将落在过滤区域的边界框内的原始图像中的像素插入到新图像中来创建新图像。
MATLAB实现:
%%%%%%%%%%%%
% Set these values depending on your input image
img = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/21044/6ce011abjw1elr8moiof7j20jg0w9jyt.jpg');
MinArea = 2000; % Minimum area to consider, in pixels
%%%%%%%%%
% End User inputs
gsImg = 255 - rgb2gray(img); % convert to grayscale (and invert 'cause that's how I think)
threshImg = gsImg > graythresh(gsImg)*max(gsImg(:)); % Threshold automatically
% Detect regions, using the saturation in place of 'intensity'
regs = regionprops(threshImg, 'BoundingBox', 'Area');
% Process regions to conform to area and saturation thresholds
regKeep = false(length(regs), 1);
for k = 1:length(regs)
regKeep(k) = (regs(k).Area > MinArea);
end
regs(~regKeep) = []; % Delete those regions that don't pass qualifications for image
% Make a new blank image to hold the passed regions
newImg = 255*ones(size(img), 'uint8');
for k = 1:length(regs)
boxHere = regs(k).BoundingBox; % Pull out bounding box for current region
boxHere([1 2]) = floor(boxHere([1 2])); % Round starting points down to next integer
boxHere([3 4]) = ceil(boxHere([3 4])); % Round ranges up to next integer
% Insert pixels within bounding box from original image into the new
% image
newImg(boxHere(2):(boxHere(2)+boxHere(4)), ...
boxHere(1):(boxHere(1)+boxHere(3)), :) = img(boxHere(2):(boxHere(2)+boxHere(4)), ...
boxHere(1):(boxHere(1)+boxHere(3)), :);
end
% Display
figure()
image(newImg);
正如您在下面链接的图片中看到的那样,它可以满足您的需求。除了图片和标头之外的所有图片都被删除了。好的一点是,如果您正在使用报纸远离头版,这将适用于彩色和灰度图像。
结果: