我正在创建一个程序来自动分离光伏模块的太阳能电池,我首先使用自适应阈值对图像进行阈值处理,以获得以下图像
之后我打算通过使用扩张来移除单元边界内的黑色像素,我已经使用了大小为(10,10)的椭圆结构元素并获得了以下图像
正如你所看到的,还有一些黑色像素,现在如果我增加结构元素的大小,我会失去单元格边界
我已经尝试了其他可用的结构元素,例如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 ....
答案 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')
您可以尝试稍微调整一下,并添加一些额外的处理,并在末尾添加自适应阈值以获得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()
从这些投影中检测细胞的边缘应该是相当简单的。