049- OpenCV分水岭算法2

话不多说,上代码,看结果。

import cv2  # 导入库
import numpy as np

'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('89.jpg')

'''
    np.copy()
# 数组拷贝,理解成备份原图像就行
# 原图像img, 备份图像img1
# 原图像随便改,备份图像还是初始的原图像
'''
temp = img.copy()

'''
    cv2.cvtColor()
# 颜色空间转换
# img为要转换的图像,后者为转换的格式
# 颜色空间有很多种,最常见的就是RGB颜色空间
# R红色,G绿色,B蓝色,OpenCV中顺序是BGR!!!!!!!
# [255, 0,0]是蓝色,[0, 255, 0]表示绿色,[0, 0, 255]表示红色
    HSV颜色空间
# 也挺常用的,H是色调,S是饱和度,V是明度,具体百度就行
'''
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('gray', gray)

'''
    cv2.threshold(src, thresh, maxval, type, dst)
 给定阈值,可以过滤灰度值过大或过小的点
# src 要滤波的图像  dst 输出图像
# thresh 给定阈值  咋判断选取的这个数的好坏呢?不停尝试。
# 用Otsu 不停尝试
# 多加一个参数:cv2.THRESH_OTSU,这时要把阈值设为 0。然后算法会找到最优阈值.
# 这个最优阈值就是返回值ret。如果不使用Otsu二值化,返回的retVal 值与设定的阈值相等
# maxval cv2.THRESH_BINARY  二值化阈值,大于阈值的部分被置为255,小于部分被置为0
# cv2.THRESH_BINARY_INV     反向二值化阈值,大于阈值部分被置为0,小于部分被置为255
# cv2.THRESH_TOZERO        大于部分保持不变, 小于阈值部分被置为0
# cv2.THRESH_TOZERO_INV    大于阈值部分被置为0,小于部分保持不变
# cv2.THRESH_TRUNC          截断阈值化,大于阈值部分被置为threshold,小于部分保持原样
'''
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.imshow('thresh', thresh)

'''
    cv2.erode(src, kerenl, dst, anchor, iterations, borderType, borderValue)
    腐蚀
# src 要腐蚀的图像  dst 输出图像
# kerenl 腐蚀操作的核, 当为NULL时, 表示使用参考点位于中心的3x3的核
# 一般使用cv2.getStructuringElement获得指定形状和尺寸的结构元素(核)
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))  # 椭圆结构
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))  # 十字结构
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  # 矩形结构
# kernel = NULL时, 表示使用参考点位于中心的3x3的核
# anchor 锚的位置, 默认值Point(-1,-1), 表示位于中心
# interations: 腐蚀的次数
# borderType: 边界模式, 一般采用默认值
# borderValue: 边界值, 一般采用默认值
'''
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))  # 椭圆结构
fg = cv2.erode(thresh, kernel, iterations=5)
cv2.imshow('fg', fg)  # 前景

'''
    cv2.dilate(src, kerenl, dst, anchor, iterations, borderType, borderValue)
    膨胀
# src 要膨胀的图像  dst 输出图像
# kerenl 膨胀操作的核, 当为NULL时, 表示使用参考点位于中心的3x3的核
# 一般使用cv2.getStructuringElement获得指定形状和尺寸的结构元素(核)
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))  # 椭圆结构
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))  # 十字结构
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  # 矩形结构
# anchor 锚的位置, 默认值Point(-1,-1), 表示位于中心
# interations: 膨胀的次数
# borderType: 边界模式, 一般采用默认值
# borderValue: 边界值, 一般采用默认值
'''
bg = cv2.dilate(thresh, kernel, iterations=5)
ret, bg = cv2.threshold(bg, 1, 120, 1)
cv2.imshow('bg', bg)    # 背景

marker = cv2.add(fg, bg)
cv2.imshow('marker', marker)
marker32 = np.int32(marker)
cv2.watershed(img, marker32)
m = cv2.convertScaleAbs(marker32)
cv2.imshow('m', m)
ret, thresh2 = cv2.threshold(m, 220, 255, cv2.THRESH_BINARY)
cv2.imshow('thresh2', thresh2)
thresh2, contours, hierarchy = cv2.findContours(thresh2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(temp, contours, -1, (0, 255, 0), -1)
cv2.imshow('temp', temp)
# res = cv2.bitwise_and(img,img, mask = thresh2)
res = cv2.addWeighted(img, 0.5, temp, 0.5, 0)
cv2.imshow('result', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
就先这样,遇到别的再补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值