正如你所看到的,这个形状是相当非标准的,我对图像处理还不熟悉,所以我的方法到目前为止都是蛮力的,而且容易出错
我需要这样做的每个图像都有一个黑点(rgb
的(77,77,77))在我要裁剪的形状的中心,它一直是我的锚
import PIL
import pandas as pd
image = PIL.Image.open(file)
rgb_im = image.convert('RGB')
color = (77,77,77)
colorindex = pd.DataFrame(data = None,columns = ['X','Y'])
for x in range(image.size[0]):
for y in range(image.size[1]):
r, g, b = rgb_im.getpixel((x, y))
if (r,g,b) == color:
append = [x,y]
append = pd.Series(append,index = colorindex.columns)
colorindex = colorindex.append(append,ignore_index = True)
center = [colorindex.mode()['X'][0],colorindex.mode()['Y'][0]]
line = pd.read_excel('C:/Users/lines RGb.xlsx') ##Prerecorded RGB Values
def findparcelline(CenterX,CenterY,direction):
if direction == 'left':
for x in range(CenterX):
r,g,b = rgb_im.getpixel((CenterX-x,CenterY))
for i in range(len(line)):
if (r,g,b) == (line.loc[i][0],line.loc[i][1],line.loc[i][2]):
pixelsave = CenterX-x
return pixelsave
elif direction == 'right':
for x in range(CenterX):
r,g,b = rgb_im.getpixel((CenterX+x,CenterY))
for i in range(len(line)):
if (r,g,b) == (line.loc[i][0],line.loc[i][1],line.loc[i][2]):
pixelsave = CenterX+x
return pixelsave
elif direction == 'down':
for y in range(CenterY):
r,g,b = rgb_im.getpixel((CenterX,CenterY + y))
for i in range(len(line)):
if (r,g,b) == (line.loc[i][0],line.loc[i][1],line.loc[i][2]):
pixelsave = CenterY + y
return pixelsave
elif direction == 'up':
for y in range(CenterY):
r,g,b = rgb_im.getpixel((CenterX,CenterY - y))
for i in range(len(line)):
if (r,g,b) == (line.loc[i][0],line.loc[i][1],line.loc[i][2]):
pixelsave = CenterY - y
return pixelsave
directions = ['left','down','right','up']
coords =[]
for direction in directions:
coords.append(findparcelline(center[0],center[1],direction))
im1 = image.crop(coords)
但是在这个例子中,有更多的rgb
颜色值,甚至在我感兴趣的线条上有一些洞
有没有办法获得黑点在中心的边界线坐标,并在记录完所有坐标后裁剪图像
提前谢谢
首先:如果您有权生成这些图像,请将它们另存为无损PNG!这些JPG工件使得获得正确的结果变得更加困难。例如,“黑点”中只有一个像素的RGB值为
(77, 77, 77)
。因此,我省略了以编程方式查找“黑点”,并假定图像中心为点位置因为你有一些红色的线和黄色的点,我通过减去绿色通道的一部分来校正红色通道,以去除黄色。在进一步强调(红色虚线在红色通道中具有高值)后,新的红色通道如下所示:
在这个新的红色通道上,我使用某种Laplace operator来检测(红色的)线。经过进一步处理,结果就是:
从这里开始,只需使用大津的方法进行一些阈值处理,以获得合适的二值图像:
最后,我找到所有轮廓,并迭代它们。如果我发现一个内部(!)轮廓-请参见this answer了解关于轮廓层次结构的详细解释-其中包含“黑点”的位置,那一定是感兴趣的形状。因为你可能会从周围得到一些奇怪的、开放的轮廓,你需要坚持内部轮廓。另外,这里有一个假设,即兴趣的形状是封闭的
提取正确的轮廓后,只需设置正确的遮罩,例如,将背景变黑,或使用该遮罩的边框裁剪图像:
以下是完整的代码:
相关问题 更多 >
编程相关推荐