Skip to content

图像裁剪算法 ​

区域生长算法 ​

域生长算法的基本思想是从一个或多个初始种子点开始,按照预定义的生长规则将相似的邻近像素不断添加到当前区域中,直到满足终止条件为止。区域生长原理

代码示例:种子条件为非黑色像素

python
def region_growing(img):
    # img = imread_chinese_path(image_path)
    height, width = img.shape
    region = np.zeros((height, width), np.uint8)

    pixel_list = deque(SearchSeed(img)) # deque双端队列提高算法速度
    length = len(pixel_list)
    while pixel_list:
        current_pixel = pixel_list.popleft()

        region[current_pixel] = 255

        neighbors = [(current_pixel[0] - 1, current_pixel[1]), (current_pixel[0] + 1, current_pixel[1]),
                     (current_pixel[0], current_pixel[1] - 1), (current_pixel[0], current_pixel[1] + 1)]

        for neighbor in neighbors:
            if neighbor[0] >= 0 and neighbor[0] < height and neighbor[1] >= 0 and neighbor[1] < width:
                if img[neighbor] >= 1 and region[neighbor] == 0:  # 如果像素是白色且不在区域内
                    pixel_list.append(neighbor)
                    region[neighbor] = 255  # Mark the pixel as part of the region as soon as it's added to the list

    mask = region == 255
    img[mask] = 0

    return img

膨胀腐蚀算法 ​

膨胀(Dilation) ​

膨胀是一种扩大图像区域的操作。

原理: ​

  1. 在原始图像中,选取一个结构元素(通常是一个矩形或圆形的模板)。
  2. 将这个结构元素移动到图像边界上。
  3. 如果结构元素与图像有交集,则将该区域的像素值设置为最大值(通常是255)。
  4. 重复步骤2,直到整个图像被扫描完毕。

效果: ​

  1. 扩大目标物体,使其在噪声和小孔洞中更容易识别。
  2. 可以消除细微的裂缝或缺陷。
  3. 有助于连接断开的部分。

腐蚀(Erosion) ​

腐蚀是一种收缩图像区域的操作。

原理: ​

  1. 与膨胀类似,但使用的是一个反向的结构元素。
  2. 在原始图像中选取一个结构元素。
  3. 将这个结构元素移动到图像内部。
  4. 如果结构元素完全包含在图像内,则将该区域的像素值设置为最小值(通常是0)。
  5. 重复步骤2,直到整个图像被扫描完毕。

效果: ​

  1. 缩小目标物体,使其更接近实际轮廓。
  2. 可以去除图像中的噪声和小物体。
  3. 有助于消除图像中的裂缝或缺陷。

代码示例:CV2库中已经集成了函数,直接调用即可

python
# 膨胀和腐蚀操作
    kernel = np.ones((3, 3), np.uint8) # 设置核大小为3*3(常用)
    img = cv2.dilate(img, kernel, iterations=1)
    img = cv2.erode(img, kernel, iterations=1)

形态学阈值 ​

形态学阈值法的基本概念 ​

形态学阈值法是一种基于图像灰度分布特征来自动确定最佳阈值的图像分割技术。它利用图像直方图的统计特性,特别是多峰直方图,来计算最优阈值。

主要步骤 ​

  1. 计算图像直方图的累积分布函数(CDF)
  2. 计算两个峰值之间的阈值,使得两个类别(前景和背景)的方差最大化
  3. 使用计算出的阈值将图像转换为二值图像

关键点 ​

  1. Otsu方法是最常用的形态学阈值法之一,它通过最大化类间方差来确定阈值。
  2. 适用于直方图有明显双峰或多峰的情况。
  3. 可以有效处理噪声和光照变化较大的图像。
  4. 相比全局阈值法,Otsu方法更能适应复杂的图像分布情况。
python
# 读取灰度图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用Otsu阈值法
_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #返回计算出的最佳阈值和图像