估计四面覆盖的区域

Estimating Region covered by all sides

我需要一些帮助来估计某种形态学操作(最好使用 skimage 或 scipy 图像或一般的 python),这可以帮助我隔离所有边包围的区域(见图片。)问题是外部 shell 可以有不同的形状和大小。封闭区域也有不同的形状和大小。 封闭(由白色区域)黑色区域需要隔离的图像示例。

隔离是指获取封闭黑色区域中的所有像素坐标。

示例 1

示例 2

另外一个警告是像这样的图像不应该被填满。

使用scipy.ndimage.binary_fill_holes

from scipy import ndimage as ndi

filled = ndi.binary_fill_holes(image)
holes = filled - image  # or np.logical_xor(filled, image)

我更喜欢@Juan 的解决方案,但为了好玩,这里有一个稍微不同的方法。从左上角开始用白色填充,剩下的就是完全封闭的像素。

#!/usr/bin/env python3

import numpy as np
from skimage.segmentation import flood_fill
import cv2

im = cv2.imread('scan.png', cv2.IMREAD_GRAYSCALE)

# Fill with white from top-left
filled = flood_fill(im, (0, 0), 255)

# Save result
cv2.imwrite('DEBUG-result.png', filled)

# Get list of black pixels
blk = np.where(filled==0)
print(f'Number of fully enclosed black pixels: {len(blk[0])}')
print(blk)

为了让大家看到图片的范围,我人为加了红色边框:

这是输出:

Number of fully enclosed black pixels: 957
(array([364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
       364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
       364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365,
       365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
       365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
       365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
       366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
       366, 366, 366, 366, 366, 366, 366, 366, 367, 367, 367, 367, 367,
       367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
       367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
       367, 367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368,
       368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
       368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
       368, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369,
       369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369,
       369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370,
       370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370,
       370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370,
       370, 370, 370, 370, 370, 370, 370, 370, 370, 371, 371, 371, 371,
       371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
       371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
       371, 371, 371, 371, 371, 371, 372, 372, 372, 372, 372, 372, 372,
       372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372,
       372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372,
       372, 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
       373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
       373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 374, 374, 374,
       374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
       374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
       374, 374, 374, 374, 375, 375, 375, 375, 375, 375, 375, 375, 375,
       375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
       375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 376, 376,
       376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376,
       376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376,
       376, 376, 376, 376, 376, 377, 377, 377, 377, 377, 377, 377, 377,
       377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377,
       377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 378,
       378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378,
       378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378,
       378, 378, 378, 378, 378, 378, 379, 379, 379, 379, 379, 379, 379,
       379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379,
       379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379,
       380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380,
       380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380,
       380, 380, 380, 380, 380, 380, 380, 381, 381, 381, 381, 381, 381,
       381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
       381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
       381, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
       382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
       382, 382, 382, 382, 382, 382, 382, 382, 383, 383, 383, 383, 383,
       383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
       383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
       383, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
       384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
       384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 385, 385, 385,
       385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
       385, 385, 385, 385, 385, 385, 385, 386, 386, 386, 386, 386, 386,
       386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386,
       386, 386, 386, 386, 386, 387, 387, 387, 387, 387, 387, 387, 387,
       387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387,
       387, 387, 387, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
       388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 389, 389,
       389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
       389, 389, 389, 389, 389, 389, 390, 390, 390, 390, 390, 390, 390,
       390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
       390, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
       391, 391, 391, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
       392, 392, 392, 392, 392, 393, 393, 393, 393, 393, 393, 393, 393,
       393, 393, 393, 393, 393, 393, 393, 394, 394, 394, 394, 394, 394,
       394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395,
       395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 396, 396,
       396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397,
       397, 397, 397, 398, 398, 398, 398, 398, 398, 398, 398, 398, 399,
       399, 399, 400, 400, 400, 401, 401, 401]), array([244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
       257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269,
       270, 271, 272, 273, 274, 275, 276, 244, 245, 246, 247, 248, 249,
       250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262,
       263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
       276, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
       256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
       269, 270, 271, 272, 273, 274, 275, 276, 241, 242, 243, 244, 245,
       246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,
       259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
       272, 273, 274, 275, 276, 241, 242, 243, 244, 245, 246, 247, 248,
       249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
       262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
       275, 276, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
       252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
       265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 241,
       242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
       255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
       268, 269, 270, 271, 272, 273, 274, 275, 276, 241, 242, 243, 244,
       245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257,
       258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270,
       271, 272, 273, 274, 275, 276, 241, 242, 243, 244, 245, 246, 247,
       248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
       261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
       274, 275, 276, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250,
       251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
       264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 241, 242, 243,
       244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
       257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269,
       270, 271, 272, 273, 241, 242, 243, 244, 245, 246, 247, 248, 249,
       250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262,
       263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 241, 242,
       243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
       256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
       269, 270, 271, 272, 273, 241, 242, 243, 244, 245, 246, 247, 248,
       249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
       262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 241,
       242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
       255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
       268, 269, 270, 271, 272, 273, 241, 242, 243, 244, 245, 246, 247,
       248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
       261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
       241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253,
       254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266,
       267, 268, 269, 270, 271, 272, 273, 241, 242, 243, 244, 245, 246,
       247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259,
       260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272,
       273, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
       253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
       266, 267, 268, 269, 270, 271, 272, 273, 241, 242, 243, 244, 245,
       246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,
       259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
       272, 273, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
       252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
       265, 266, 267, 268, 269, 270, 271, 272, 273, 253, 254, 255, 256,
       257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269,
       270, 271, 272, 273, 274, 275, 276, 253, 254, 255, 256, 257, 258,
       259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
       272, 273, 274, 275, 276, 253, 254, 255, 256, 257, 258, 259, 260,
       261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
       274, 275, 276, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
       266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 256, 257,
       258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270,
       271, 272, 273, 274, 275, 276, 256, 257, 258, 259, 260, 261, 262,
       263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
       276, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270,
       271, 272, 273, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
       269, 270, 271, 272, 273, 259, 260, 261, 262, 263, 264, 265, 266,
       267, 268, 269, 270, 271, 272, 273, 259, 260, 261, 262, 263, 264,
       265, 266, 267, 268, 269, 270, 271, 272, 273, 259, 260, 261, 262,
       263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 262, 263,
       264, 265, 266, 267, 268, 269, 270, 262, 263, 264, 265, 266, 267,
       268, 269, 270, 262, 263, 264, 265, 266, 267, 268, 269, 270, 265,
       266, 267, 265, 266, 267, 265, 266, 267]))

希望你能从每个数组的第一个元素看出第一个黑色像素在 364,244

请注意,如果扫描有可能触及图像的边缘,则洪水填充将无法“流动”一直围绕边缘.在这种情况下,您可以简单地在边缘周围一直添加一个 1 像素宽的黑色边框,以便 floodfill 流动...然后将其删除。