OpenCV python 图像分割(距离变换函数)

OpenCV python 图像分割(距离变换函数)

处理图像:[my_coin.jpg]
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt
import numpy as np


def main():

    # 1.导入图片
    img_src = cv2.imread("my_coin.jpg")

    # 2.转换为灰度图片
    img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
    img_rgb = cv2.cvtColor(img_src, cv2.COLOR_BGR2RGB)
    img_show = img_rgb.copy()

    # 3.二值化处理
    ret, img_bin = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)

    # 4.执行开运算
    k = np.ones((3, 3), np.uint8)
    img_opening = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN, kernel=k, iterations=1)

    # 5.距离计算与前景剥离
    dist_transform = cv2.distanceTransform(img_opening, cv2.DIST_L2, 5)
    ret, img_fore = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, cv2.THRESH_BINARY)

    # 6.显示结果
    plt.figure("显示结果", figsize=(14, 10))
    plt.subplot(221)
    plt.imshow(img_show)
    plt.axis("off")

    plt.subplot(222)
    plt.imshow(img_bin, cmap="gray")
    plt.axis("off")

    plt.subplot(223)
    plt.imshow(dist_transform)
    plt.axis("off")

    plt.subplot(224)
    plt.imshow(img_fore)
    plt.axis("off")

    plt.show()


if __name__ == '__main__':
    main()

处理结果图片
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
基于分水岭算法的图像分割是一种常用的图像处理技术,可以将图像分割成多个区域,每个区域内的像素具有相似的特征。在 OpenCV 中,可以使用 cv2.watershed() 函数实现基于分水岭算法的图像分割。 下面是一个简单的 Python 示例,演示如何使用基于分水岭算法的图像分割: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 阈值分割 ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) # 形态学操作 kernel = np.ones((3,3),np.uint8) opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2) # 距离变换 dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5) ret, sure_fg = cv2.threshold(dist_transform,0.1*dist_transform.max(),255,0) # 背景区域 sure_bg = cv2.dilate(opening,kernel,iterations=3) # 不确定区域 sure_fg = np.uint8(sure_fg) unknown = cv2.subtract(sure_bg,sure_fg) # 标记连通区域 ret, markers = cv2.connectedComponents(sure_fg) markers = markers + 1 markers[unknown==255] = 0 # 应用分水岭算法 markers = cv2.watershed(img,markers) img[markers == -1] = [255,0,0] # 显示结果 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的示例中,首先读取一张图像,并将其转换为灰度图像。然后使用阈值分割算法将图像二值化。接下来,进行形态学操作,以去除图像中的噪声。然后使用距离变换算法计算前景区域,并将其阈值化。接着,使用形态学操作计算背景区域。最后,使用 cv2.connectedComponents() 函数计算不确定区域,并使用标记连通区域的方法生成分水岭算法的输入标记图像。最后,应用 cv2.watershed() 函数进行图像分割,并在窗口中显示结果。 需要注意的是,分水岭算法的结果依赖于输入标记图像的质量,因此需要根据具体情况进行调整,比如阈值分割的参数、形态学操作的参数、距离变换的参数等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷益--飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值