有没有更有效的方法来找到这个对象的轮廓并填充python中的空白?
Is there a more efficient way to find the contour of this object and fill the blank spaces in python?
我正在尝试借助形态学操作来改善此图像。我得到的结果很好,但是得到结果图像需要将近 40 秒,我想知道是否有任何其他方法可以在不花费太长时间的情况下获得类似甚至更好的结果。
下面我附上了我用来增强原始图像的图像和代码。谢谢
Original spine image
Final spine image
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.morphology import (square, rectangle, diamond, disk, erosion, dilation, opening, closing)
im = imread('/content/drive/MyDrive/Proc_imag/Spine.png')
imf = closing(im,disk(40))
imf = opening(imf,rectangle(75,1))
imf[975:,:] = 0
plt.imshow(im,cmap='gray')
plt.title('Original')
plt.show()
plt.imshow(imf,cmap='gray')
plt.title('Final')
plt.show()
您几乎所有的时间都被关闭函数占用了。这主要是因为该函数的运行时与内核大小的关系非常糟糕,而 disk(40) 可能是一个 80x80 的内核。我们可以通过缩小图像和 运行 在较小图像上的等效大小的内核来近似相同的东西。
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.morphology import (square, rectangle, diamond, disk, erosion, dilation, opening, closing)
from skimage.transform import rescale
import time
import numpy as np
# load image
start = time.time();
im = imread('spine.png')
imf = np.copy(im);
end = time.time();
print("Read Time: " + str(end - start));
# resize down
scale = 4.0;
start = time.time();
imf = rescale(imf, 1.0 / scale, order=0, anti_aliasing=False, multichannel=False);
end = time.time();
print("Scale Time: " + str(end - start));
# disk, fill in holes
start = time.time();
imf = closing(imf,disk(40 // scale))
end = time.time();
print("Disk Time: " + str(end - start));
# resize up
start = time.time();
imf = rescale(imf, scale, order=0, anti_aliasing=False, multichannel=False);
end = time.time();
print("Upscale Time: " + str(end - start));
# rect, remove thin horizontal lines
start = time.time();
imf = opening(imf,rectangle(75,1))
end = time.time();
print("Rect Time: " + str(end - start));
# ???
imf[975:,:] = 0
# show original image
plt.imshow(im,cmap='gray')
plt.title('Original')
plt.show()
# show processed image
plt.imshow(imf,cmap='gray')
plt.title('Final')
plt.show()
我正在尝试借助形态学操作来改善此图像。我得到的结果很好,但是得到结果图像需要将近 40 秒,我想知道是否有任何其他方法可以在不花费太长时间的情况下获得类似甚至更好的结果。
下面我附上了我用来增强原始图像的图像和代码。谢谢
Original spine image Final spine image
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.morphology import (square, rectangle, diamond, disk, erosion, dilation, opening, closing)
im = imread('/content/drive/MyDrive/Proc_imag/Spine.png')
imf = closing(im,disk(40))
imf = opening(imf,rectangle(75,1))
imf[975:,:] = 0
plt.imshow(im,cmap='gray')
plt.title('Original')
plt.show()
plt.imshow(imf,cmap='gray')
plt.title('Final')
plt.show()
您几乎所有的时间都被关闭函数占用了。这主要是因为该函数的运行时与内核大小的关系非常糟糕,而 disk(40) 可能是一个 80x80 的内核。我们可以通过缩小图像和 运行 在较小图像上的等效大小的内核来近似相同的东西。
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.morphology import (square, rectangle, diamond, disk, erosion, dilation, opening, closing)
from skimage.transform import rescale
import time
import numpy as np
# load image
start = time.time();
im = imread('spine.png')
imf = np.copy(im);
end = time.time();
print("Read Time: " + str(end - start));
# resize down
scale = 4.0;
start = time.time();
imf = rescale(imf, 1.0 / scale, order=0, anti_aliasing=False, multichannel=False);
end = time.time();
print("Scale Time: " + str(end - start));
# disk, fill in holes
start = time.time();
imf = closing(imf,disk(40 // scale))
end = time.time();
print("Disk Time: " + str(end - start));
# resize up
start = time.time();
imf = rescale(imf, scale, order=0, anti_aliasing=False, multichannel=False);
end = time.time();
print("Upscale Time: " + str(end - start));
# rect, remove thin horizontal lines
start = time.time();
imf = opening(imf,rectangle(75,1))
end = time.time();
print("Rect Time: " + str(end - start));
# ???
imf[975:,:] = 0
# show original image
plt.imshow(im,cmap='gray')
plt.title('Original')
plt.show()
# show processed image
plt.imshow(imf,cmap='gray')
plt.title('Final')
plt.show()