Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 低对比度图像的Python边缘检测_Image Processing_Edge Detection - Fatal编程技术网

Image processing 低对比度图像的Python边缘检测

Image processing 低对比度图像的Python边缘检测,image-processing,edge-detection,Image Processing,Edge Detection,我想画出绘制区域的深度,并画出边界,我曾尝试使用Canny边缘检测,但获取边缘并不好。有没有办法获得感兴趣边界的像素?边界线中的像素强度(灰度)与周围区域没有明显差异。 感兴趣的区域是金属上的熔池。目的是找到熔池的深度。我尝试了精明的边缘检测,但似乎无法解决问题。 有没有其他方法可以使用python来绘制我在图2中用红色标出的熔池边界的坐标?原始图像感兴趣区域(红色) 精明的边缘检测熔池正在移动。我想使用python来获得熔池的深度变化。我有很多照片 强水平低通滤波将提高信噪比,使上边缘易于检测

我想画出绘制区域的深度,并画出边界,我曾尝试使用Canny边缘检测,但获取边缘并不好。有没有办法获得感兴趣边界的像素?边界线中的像素强度(灰度)与周围区域没有明显差异。 感兴趣的区域是金属上的熔池。目的是找到熔池的深度。我尝试了精明的边缘检测,但似乎无法解决问题。 有没有其他方法可以使用python来绘制我在图2中用红色标出的熔池边界的坐标?原始图像感兴趣区域(红色) 精明的边缘检测熔池正在移动。我想使用python来获得熔池的深度变化。我有很多照片


强水平低通滤波将提高信噪比,使上边缘易于检测

请注意,原始图像的直接二值化效果更好

自适应阈值也很有趣,不过需要一些调整


我认为获得所需金属池信息的最佳方法是对其进行分割。由于图像有噪声,我认为图形切割是更好的选择

我使用垂直Scharr滤波估计池边界,并使用它们计算图弧权重

因此,我使用图像的上下边界作为graph cut算法的源和汇(这些像素将属于不同的标签)

执行第二次分割以获得没有池的水平线,并计算它们的差值以获得最终结果

必须调整
beta
参数,随着它的增加,它将更符合您的权重(噪声边界)。我发现50分成绩不错,但你应该好好利用它

将numpy导入为np
从skimage导入io、过滤器、测量
将skimage.形态学导入为变形
将matplotlib.pyplot作为plt导入
导入maxflow
def正常化(im):
im-=im.min()
返回im/im.max()
def图形_切割(重量):
g=maxflow.GraphFloat()
nodeids=g.add\u grid\u节点(weights.shape)
结构=maxflow.vonNeumann_结构(ndim=2,directed=True)
g、 添加网格边(节点ID、权重、结构=结构、对称=真)
g、 添加网格(节点ID[1,:],0,1e16)
g、 添加网格(节点ID[-1,:],1e16,0)
g、 maxflow()
返回g.get_网格_段(节点ID)
def get_最大(标签):
标签=度量值。标签(标签)
最大=标签==np.argmax(np.bincount(label.flat)[1:])+1
回报最大
def main():
im=io.imread(“example.png”)
im=过滤器中值(im,变形磁盘(5))
#池分割
β=50#参数
aux=过滤器。scharr_v(im)
aux=标准化(np.abs(aux))
权重=np.exp(-beta*aux)
池=图形_切割(权重)
#结束
#曲面分割
aux=np.abs(过滤器、沙尔(im))
aux=标准化(aux)
权重=np.exp(-aux)
surf=图形切割(权重)
#结束
#结果
res=池^surf#xor
res=获取最大值(res)
等高线=测量。查找等高线(分辨率,0.5)
图,ax=plt.子批次()
ax.imshow(im,cmap='gray')
对于等高线中的等高线:
ax.绘图(等高线[:,1],等高线[:,0],线宽=1,c=红色)
plt.show()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
结果:


图1中的红色涂鸦是您感兴趣的区域吗?嗨,JoOkuma,是的,这是我想要检测的边界。你有什么建议吗?这似乎是一个具有挑战性的问题。您要将此应用于多个图像吗?您感兴趣区域(ROI)的模式是否相同?附加图片或此任务的上下文将增加您获得帮助的机会。@JoOkuma感谢您的建议!我已重新编写了描述。@MarkSetchell谢谢您的评论!我重新措辞了描述。看看是否更好。Yves,你可以添加你使用的过滤器内核/参数吗?请,这样其他人也可以得到同样的效果。谢谢。@MarkSetchell:对不起,我用的是专有软件。@YvesDaoust我想OP是在寻找他们用红色勾勒出来的小井,而不是大的水平边缘。对于OP:这个答案和你的问题有什么关系吗?如果是,我将删除我的。@Yves Daoust是的,这个答案与我的问题相关。@JoOkuma谢谢你的回答!
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image.tif',0)
edges = cv2.Canny(img,100,20)

plt.subplots(),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplots(),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()