选择正确的结构元素

时间:2018-03-09 20:19:57

标签: python opencv image-processing image-morphology

我正在创建一个程序来自动分离光伏模块的太阳能电池,我首先使用自适应阈值对图像进行阈值处理,以获得以下图像

Thresholded image

之后我打算通过使用扩张来移除单元边界内的黑色像素,我已经使用了大小为(10,10)的椭圆结构元素并获得了以下图像

Thresholded image after dilation (structuring element size (10,10)

正如你所看到的,还有一些黑色像素,现在如果我增加结构元素的大小,我会失去单元格边界

Thresholded image after dilation (structuring element size (15,15)

我已经尝试了其他可用的结构元素,例如cross和rectangle,但没有任何成功,因此我需要定义一个自定义内核,并且不知道如何定义它。

CASE WHEN 
(e.account_id IN (SELECT DISTINCT account_id, app_version, app_build FROM 
manifest) 
OR( e.app_version IN (SELECT DISTINCT account_id, app_version, app_build 
FROM manifest) 
OR (e.app_build IN (SELECT DISTINCT account_id, app_version, app_build FROM 
manifest))
THEN ....

Original image before thresholding

1 个答案:

答案 0 :(得分:2)

我的第一条建议是不要马上开门。阈值是你想在最后做的事情。阈值处理会丢掉有价值的信息。形态学操作也适用于灰度值图像!

选择正确的形态运算符以仅保留您感兴趣的形状实际上非常直观。在这种情况下,您希望保持水平和垂直线。让我们使用行结构元素。线条很暗,所以我们使用闭合来移除看起来不像我们线条的东西。

使用垂直线的关闭将删除所有水平线,使用水平线关闭将删除所有垂直线。那么如何将这两者结合起来呢?事实证明,两次关闭的下限(像素方式最小值)也是收盘价。因此,具有垂直线的闭合和具有水平线的闭合的下限是同时关闭两条线,您将保留这两条线中的任何一条适合的形状。

这是一个例子。我正在使用PyDIP(我没有OpenCV)。

import PyDIP as dip
img = dip.ImageReadTIFF('/Users/cris/Downloads/ZrF7k.tif')
img = img.TensorElement(1) # keep only green channel
img = img[0:-2,1:-1]       # let's remove the artifacts at the right and top edges
f1 = dip.Closing(img, dip.SE([50,1],'rectangular'))
f2 = dip.Closing(img, dip.SE([1,50],'rectangular'))
out = dip.Infimum(f1, f2)
out.Show('lin')

enter image description here

您可以尝试稍微调整一下,并添加一些额外的处理,并在末尾添加自适应阈值以获得PV单元的边缘。但实际上有更好的方法可以找到这些。

我在这里利用了这个事实,即面板是非常直的w.r.t.图像,它覆盖整个图像。我们可以简单地沿着行和列进行平均投影:

x = dip.Mean(out, process=[1, 0]).Squeeze()
y = dip.Mean(out, process=[0, 1]).Squeeze()
import matplotlib.pyplot as pp
pp.subplot(2,1,1)
pp.plot(x)
pp.subplot(2,1,2)
pp.plot(y)
pp.show()

enter image description here

从这些投影中检测细胞的边缘应该是相当简单的。