代码之家  ›  专栏  ›  技术社区  ›  Mohamed Obeid

在灰度图像上散射网格

  •  1
  • Mohamed Obeid  · 技术社区  · 1 年前

    我正在尝试根据灰度图像创建一个numpy网格。例如,考虑到这个图像

    Geometry figure

    我想分散点以获得类似于

    Scattered points

    在笛卡尔坐标系中。 有没有库可以完成这样的任务,或者我需要从头开始实现一些东西?提前谢谢,我将感谢任何帮助。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Mark Setchell    1 年前

    猜测一下你的意思,这里有一种方法:

    • 以灰度加载图像
    • 纯黑白阈值
    • 获取所有黑色像素的坐标
    • 随机子采样0.5%的坐标
    • 创建空输出图像
    • 在二次采样位置的输出图像的alpha通道上绘制白色圆圈,这将使黑色背景在这些位置变得可见

    #!/usr/bin/env python3
    
    import numpy as np
    import cv2 as cv
    
    # Load image as greyscale
    im = cv.imread('Gkzaa.png', cv.IMREAD_GRAYSCALE)
    
    # Otsu threshold to pure black and pure white, i.e. 0 or 255
    _, thresh = cv.threshold(im, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
    
    # Get X and Y coordinates of all black pixels
    Y, X = np.where(thresh==0)
    nBlack = len(Y)
    
    # Get indices of 0.5% of those black pixels
    indices = np.random.choice(nBlack, size=int(nBlack*0.005), replace=False)
    
    # Form an empty (black) output image and an alpha channel for it
    BGR = np.zeros((*im.shape,3), np.uint8)
    A   = np.zeros_like(im)
    
    # Draw circles of opacity into the alpha channel at selected indices
    for i in indices:
        cv.circle(A, center=(X[i], Y[i]), radius=4, color=255, thickness=cv.FILLED)
    
    # Stack the alpha channel onto the BGR channel to make BGRA and save
    res = np.dstack((BGR,A))
    cv.imwrite('result.png', res)
    

    enter image description here