• 分水岭 代码


     1 # Author:Winter Liu is coming!
     2 import cv2 as cv
     3 import numpy as np
     4 
     5 
     6 def watershed_demo(image):
     7     # 偏移均值滤波
     8     blur = cv.pyrMeanShiftFiltering(image, 10, 100)
     9     # 转换为灰度图像
    10     gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
    11     # 二值化,注意 THRESH_BINARY_INV(背景白色) 和 THRESH_BINARY(背景黑色)
    12     ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    13     # 构造矩形结构元素
    14     kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    15     # 两次 开操作(先腐蚀,再膨胀) 消除噪点
    16     mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2)
    17     # 膨胀3次 放大需要的区域
    18     sure_bg = cv.dilate(mb, kernel, iterations=3)
    19     cv.imshow("sure_bg", sure_bg)
    20     # 距离变换,目标白色255,背景黑色0,像素点距离背景越远,距离越大,使用距离值替代像素值
    21     dist = cv.distanceTransform(mb, cv.DIST_L2, 5)
    22     print(dist.dtype)
    23 
    24     # distanceTransform()返回的图像数据是浮点数,显示时大于1的都会按照白色1.0处理
    25     cv.imshow("dist", dist)
    26     # 对图像进行归一化处理
    27     dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)
    28     # 放大像素点值,避免值过小无法显示效果
    29     cv.imshow("dist-t", dist_output*60)
    30 
    31     ret, sure_fg = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)
    32     cv.imshow("sure-fg", sure_fg)
    33 
    34     surface_fg = np.uint8(sure_fg)
    35     unknown = cv.subtract(sure_bg, surface_fg)
    36     cv.imshow("unknown", unknown)
    37     # ret种子数,从种子开始向外涨水
    38     # markers:与原图像大小相同,数据类型为 int32 的数组,包含原图像的确认区域的数据
    39     ret, markers = cv.connectedComponents(surface_fg)
    40     print(ret)
    41     # 确定分类的区域使用不同的正整数标记,unknown区域使用 0 标记
    42     # connectedComponents()会在标签中 将背景标为 0,
    43     # 其他的使用从 1 开始的正整数标记(其实这就是我们的种子,水漫时会从这里漫出)
    44     # 如果背景标记为 0,为了区分未知区域,将背景区域+1
    45     markers += 1
    46     markers[unknown == 255] = 0
    47     # 开始漫水
    48     markers = cv.watershed(image, markers)
    49     image[markers == -1] = [0, 0, 255]
    50     cv.imshow("result", image)
    51 
    52 
    53 src = cv.imread(r"C:PycharmProjectsOpenCVpiccoins.jpg")
    54 cv.imshow("original_pic", src)
    55 watershed_demo(src)
    56 cv.waitKey(0)
    57 cv.destroyAllWindows()
  • 相关阅读:
    【POJ】2778 DNA Sequence(AC自动机+矩阵快速幂)
    【HDU】4352 XHXJ's LIS(数位dp+状压)
    【BZOJ】1756: Vijos1083 小白逛公园(线段树)
    【POJ】1062 昂贵的聘礼 (最短路)
    【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)
    【Codeforces】Codeforces Round #492 (Div. 2) (Contest 996)
    【Codeforces】Educational Codeforces Round 46(Contest 1000)
    【POJ】1935 Journey(树形dp)
    【UVALive】4094 WonderTeam(神结论)
    【POJ】1185 炮兵阵地(状压dp)
  • 原文地址:https://www.cnblogs.com/nmucomputer/p/12206751.html
Copyright © 2020-2023  润新知