【问题标题】:How to detect the outlines of cells of a pillbox in opencv in python?如何在python中检测opencv中药盒的细胞轮廓?
【发布时间】:2018-04-08 14:14:26
【问题描述】:

所以我正在尝试制作一个 opencv 程序,可以检测药盒的哪些单元格中有药丸。

我最初的想法是:

  • 使用 canny 找到所有边缘
  • 运行 hough 变换以查找单元格的边界
  • 查看 14 个单元格中哪个单元格的白色像素大于某个阈值。

但是,在实践中,我似乎真的无法使用 canny 找到好的边缘,因为相机是劣质的树莓派相机。

有人对我如何找到 14 个单元格的轮廓有任何建议吗?

更新:

所以我在墙壁的边缘贴上了胶带,经过一些处理,可以得到如下图

现在,我如何获得 14 个牢房内部的 14 个面具?我尝试在这张图片上做一个霍夫变换,但它仍然会创建它不应该创建的虚假线条,而不是创建它应该创建的线条

【问题讨论】:

  • 总是同一个碉堡吗?还是多个相同的?您可以控制照明、相机位置、成像距离吗?
  • 总是同一个药盒,是的

标签: python opencv computer-vision


【解决方案1】:

考虑到你控制成像条件,我建议你稍微改进一下。

首先,让您的相机直接指向药盒所在的表面。这将使碉堡的几何形状更加简单。

还要尽量避免阴影。他们不是不可能处理的,但没有问题会更容易。良好的照明可以轻松解决大多数计算机视觉问题。

您有一个白色背景上的红色框。分割出盒子应该很容易(只需检测红色像素)。找到最大的连通分量,然后确定四个角。这给了你一个矩形。既然你知道盒子的几何形状,你现在需要做的就是把矩形分成一个 7x2 的网格。这消除了检测单个细胞的需要。

如果您真的想检测单个单元格,请考虑将单元格的边缘涂成黑色。再次,面对困难的视力问题,调整你的世界,直到问题变得容易。 :)


编辑

最好使用蓝色胶带。蓝色在照片中很好地呈现出来。 JPEG压缩确实使区分颜色变得比必要的困难,我希望您可以在不通过JPEG的情况下读取和处理图像。这是我得到的:

有一点我没有在意的透视失真。应该也可以对此进行校正,因为找到框的轮廓很简单,并且可以告诉您有关失真的所有信息。

我使用过 MATLAB,因为这是我最熟悉的快速原型制作方法。我希望你在将它翻译成 Python 时不会遇到麻烦。我使用了 DIPimage 工具箱,它有一个 Python 对应物 PyDIP(我使用的所有功能都可以从 Python 中获得)。 Here is the GitHub repository.

% Read in image
img = imread('https://i.stack.imgur.com/AXkGH.jpg');
img = joinchannels('rgb',img);
% Convert to Lab color space
lab = colorspace(img,'lab');
% Get red area, make it into a single large blob, and measure its orientation
red = lab{2} > 30;
red = closing(red,20);
msr = measure(red,[],'feret');
[~,indx] = max(msr);
angle = msr(indx(1)).feret(5);
% Rotate the original image to make the box horizontal
img = colorspace(rotation(img,-angle-pi/2,'linear','add max'),'rgb'); % BUG! rotation loses color space
% Convert to Lab color space again
lab = colorspace(img,'lab');
% Get blue masking tape
blue = lab{3} < -10;
% Poor man's Radon transform -- horizontal lines
horiz = sum(blue,[],1);
% Expect three peaks
horiz = gaussf(horiz,3);
peaks = find(maxima(horiz));
horiz = double(horiz(peaks));
[~,indx] = sort(horiz,'descend');
horiz = sort(peaks(indx(1:3))); % 3 largest maxima
% Poor man's Radon transform -- vertical lines
vert = sum(blue,[],2);
% Expect eight peaks
vert = gaussf(vert,3);
peaks = find(maxima(vert));
vert = double(vert(peaks));
[~,indx] = sort(vert,'descend');
vert = sort(peaks(indx(1:8))); % 8 largest maxima
% Draw lines over rotated input image
for ii=1:8
   img(vert(ii),horiz(1):horiz(end)) = [0,255,0];
end
for ii=1:3
   img(vert(1):vert(end),horiz(ii)) = [0,255,0];
end

【讨论】:

  • 好的,所以我在单元格壁上添加了遮蔽胶带,并使用了一些处理,现在可以获取编辑后的图像。如何找到内部牢房的面具?
  • @quantumbutterfly:请发布您从中获得检测的彩色图像。
  • @quantumbutterfly:我做了一个快速的解决方案。我确信还有很大的改进空间,但我希望它能给你一些关于如何继续你的项目的好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2016-09-25
  • 2019-11-01
相关资源
最近更新 更多