程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Remove open lines, but keep closed lines

发布于2024-10-31 20:32     阅读(1006)     评论(0)     点赞(25)     收藏(0)


I have developed a convolution with a kernel set that reliably removes singular and protruding white dots when applied 2-3 times to an image of zeros (black) and ones (white):

import numpy as np
from PIL import Image
from scipy.ndimage import convolve

kernels = [
    np.array([[1, 1, 1], [-4, 1, -4], [-4, -4, -4]]),
    np.array([[-4, -4, 1], [-4, 1, 1], [-4, -4, 1]]),
    np.array([[-4, -4, -4], [-4, 1, -4], [1, 1, 1]]),
    np.array([[1, -4, -4], [1, 1, -4], [1, -4, -4]])
]

image_path = 'path/to/image/file'
with Image.open(image_path) as image:
    
    if image.mode == 'RGBA':
        image = image.convert('RGB')

    image_np = np.array(image)
    mask = np.isin(image_np, [200, 200, 200]).all(axis=-1)
    
    binary_mask = np.zeros(image_np.shape[:2], dtype=int)
    binary_mask[mask] = 1
    
    for kernel in kernels:
        convolution = convolve(binary_mask, kernel, mode='constant')
        binary_mask[(binary_mask == 1) & (convolution >= 1)] = 0

The most important property of the convolution is that it preserves closed lines (e.g. the edge of a rectangle). However, the convolution only removes open lines (i.e. lines with two ends) completely if the convolution is performed half as often as the length of the line.

This is very ineffective for long lines. Can you help me to develop a kernel (set) that removes open 1-pixel-thick lines after a few convolutions, but preserves closed 1-pixel-thick lines?

Example image


解决方案


暂无回答



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2040405/e708ec1fa71d8ce5c42e/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)