【发布时间】:2016-08-24 12:45:36
【问题描述】:
我想检测图像内容,我需要做的是 查找图像是衬衫还是裤子。
如果我提供 T 恤的图片,那么 基于比较形状,我需要给定图像是 T 恤的结果
我尝试的是 Harr 级联,但它没有给出正确的输出。对于这个样本量,requried 太大了
【问题讨论】:
标签: opencv image-processing computer-vision tensorflow image-recognition
我想检测图像内容,我需要做的是 查找图像是衬衫还是裤子。
如果我提供 T 恤的图片,那么 基于比较形状,我需要给定图像是 T 恤的结果
我尝试的是 Harr 级联,但它没有给出正确的输出。对于这个样本量,requried 太大了
【问题讨论】:
标签: opencv image-processing computer-vision tensorflow image-recognition
假设您只想分离仅包含感兴趣对象的图像,您可以使用 BOW(视觉词袋)将图像呈现为一组特征,然后使用 SVM 或任何其他分类器进行分类。
您还可以使用特征检测器 + 描述符 + 分类器(例如 SURF + SVM)。 虽然现在有更强大和更快的特征检测器......
为了避免训练过程,您甚至可以尝试使用模板匹配(每个大纲)。 提供了一种这样的算法: Fast template matching - Codeproject
Haar 级联用于在包含其他内容的图像中进行对象检测,因为它采用滑动窗口检测 + 它包含在性能和鲁棒性之间进行权衡的阶段 - 它们速度很快,但可能会遗漏一些对象,因为每个阶段都容易出现累积的错误分类错误。
【讨论】:
如果您的图像包含已分割的对象,如您的示例所示,您可以创建一个二进制图像,在其中指示对象与背景像素。
之后,假设对象一般不旋转或扭曲,您可以使用简单的特征进行分类。例如,对于上述情况,只需计算有 2 次运行前景像素的扫描线的百分比。对于衬衫,这应该是一个低价值,而对于裤子,它应该是高的。
显然,如果给定的示例图像不能代表您实际尝试解决的问题,那么这将行不通。
编辑:一些示例 matlab 代码:
function ratio=TwoRunFeature(I)
g=rgb2gray(I);
b=imdilate(g<255,ones(5));
d=abs(imfilter(b,[-1 1]));
runs=sum(d,2);
ratio=sum(runs==2) / sum(runs==1);
end
function TestImage(name)
I=imread(name);
fprintf('%s: %f\n',name,TwoRunFeature(I));
end
TestImage('pants.jpg');
TestImage('shirt.jpg');
打印:
pants.jpg: 1.947977
shirt.jpg: 0.068627
裤子会给出高数字和衬衫低。只需在任何你想要的地方设置门槛,你就完成了。
【讨论】:
我假设这两个图像来自您拥有的数据库。 根据我的经验,在此类图像上应用特征(局部描述符)会因为分割或将背景设置为单色而创建一种人工特征。在您的情况下,第二个重点是这些图像可能具有不同的颜色或纹理,并且大多数检测到的特征将来自对象内的区域。这些区域并不重要,与分类无关。 但是拥有分段图像应该会使问题变得更容易。 适合您情况的最佳和最简单的解决方案: 1. 将图像转换为灰度,然后通过阈值化转换为二进制。 2. 反转图像,背景为黑色,物体为白色。 3. 填充孔洞:如果物体内图像的任何部分是白色的,这将导致孔洞。 4. 现在只检测边界。 通过 I = 膨胀的 IBinary - IBinary 5. 采样边界: 在每个大小为 4x4 的窗口中只选择一个非零像素 6. 下一步是使用 Shape context descriptor : 来描述你的图像。 7.通过视觉词袋或稀疏编码,重新表示图像。 8. 最大池化以获得丰富的表示。 9-支持向量机
【讨论】:
您正在寻找的东西就是这个。 它将帮助您解决问题
【讨论】: