话不多说,上代码,看结果。
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()
结果如下图。
就先这样,遇到别的再补充。