从白色背景中提取旋转对象

Posted

技术标签:

【中文标题】从白色背景中提取旋转对象【英文标题】:Extract rotated object from a white background 【发布时间】:2015-02-20 16:29:28 【问题描述】:

我有一张白色背景的图像,并尝试使用 MATLAB 提取其中的对象。我尝试了不同的技术(有界框),但没有得到想要的结果。我已经尝试过这篇 *** 帖子,但效果不佳:MATLAB Auto Crop

如何提取对象?知道哪种技术适合吗?

图片如下:

【问题讨论】:

图片不错。你能准确地说出想要的结果是什么吗? 手动显示想要的结果。 我猜你有几张图像(扫描),支票随机定位和定向,你想将支票提取为矩形图像。你确认了吗? 请注意您的背景不是白色的。右侧有阴影,会使事情复杂化。 它会影响结果。但有什么建议我该怎么做?我应该使用哪种技术来提取图像? 【参考方案1】:

我提出以下工作流程:

    二值化图像 获取主要对象的质心和方向 裁剪图像以将对象的中心设置为图像的中心 相对于中心旋转对象以补偿倾斜 再次裁剪以获取对象

在实践中,由于阴影以及对象的白色部分和背景之间的边界不太明确,步骤 1 的执行变得相当复杂。我使用的技巧依赖于这样一个事实:由于对象内部的许多细节(以及 jpg 压缩),整个对象都有很多“噪音”。因此,寻找边缘与 BW 膨胀相结合会产生非常不错的二值化图像。然后我用regioprops过滤了小的异常值,得到了对象的属性。

代码如下:

% --- Load image
Img = imread('Tilted.jpg');

% --- Binarisation

% Find edges and dilate to get a bloc
BW = edge(mean(Img,3),'sobel');
BW = imdilate(BW, strel('disk',5));

% Get BW image
RP = regionprops(BW, 'Area', 'PixelIdxList', 'Centroid', 'Orientation');
[~, i] = max([RP(:).Area]);
BW = Img(:,:,1)*0;
BW(RP(i).PixelIdxList) = 1;
x = RP(i).Centroid(1);
y = RP(i).Centroid(2);
theta = -RP(i).Orientation;

% imshow(BW)
% plot(x+[0 500*cos(theta*pi/180)], y+[0 500*sin(theta*pi/180)]);
% return

% --- First crop
w = min(x-1, size(Img,2)-x);
h = min(y-1, size(Img,1)-y);
C = Img(ceil(y-h):floor(y+h), ceil(x-w):floor(x+w),:);

% --- Rotate image
R = imrotate(C, theta);
R(R==0) = 255;

% --- Second crop

% Parameters (to adjust)
th = 70;
margin = 25; 

% Remove grey levels
Rwg = std(double(R),0,3).^2;

% Get x-bounds
sx = sum(Rwg,1);
x1 = max(find(sx>prctile(sx,th), 1, 'first')-margin, 1);
x2 = min(find(sx>prctile(sx,30), 1, 'last')+margin, size(Rwg,1));

% Get y-bounds
sy = sum(Rwg,2);
y1 = max(find(sy>prctile(sy,th), 1, 'first')-margin, 1);
y2 = min(find(sy>prctile(sy,th), 1, 'last')+margin, size(Rwg,1));

Res = R(y1:y2, x1:x2, :);

% --- Display
imshow(Res)

当然,如果您要处理许多不同的图像,这可能不会每次都有效。此代码只是一个起点,您现在必须对其进行修改以满足您的确切需求。

最好的,

【讨论】:

何,如果您对答案感到满意,您可以通过将问题标记为已解决或将您的一张支票寄给我来表示感谢 ;-) 调整th和/或边距 @rajahassan:批准您的编辑,目的是隐藏个人身份信息。 @rajahassan:好的,我从答案中删除了图像。但这只不过是您发布的图片的一部分......

以上是关于从白色背景中提取旋转对象的主要内容,如果未能解决你的问题,请参考以下文章

从 Scenekit 中的世界变换中提取旋转

如何使用halcon ,从下图中提取红色区域,

从黑色背景OpenCV C++中提取对象

从彩色背景中提取黑色对象

使用哪个库从图像中提取文本?

通过在 C# 中切割边缘从图像中提取对象