前言
分水岭算法是一种图像区域分割法,在分割的过程中,他会把临近像素之间的相似性作为重要的参考依据,从而在空间位置上相近并且灰度值相近的像素点相互连接起来构成一个封闭的轮廓。分水岭算法的常用操作步骤:先彩色图像灰度化,然后再求得梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线。本文将从代码角度拆分还原操作步骤。
岩石原始图片
岩石分割后的图片
提示:以下是本篇文章正文内容,下面案例可供参考
一、引入库
import numpy as np
import cv2 as cv2
from matplotlib import pyplot as plt
二、代码主干
1.读取图像 灰度化
代码如下(示例):
img = cv2.imread('001.jpg')
#均值漂移,沿时间轴找出颜色空间的峰值分布,彩色图像分割(中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域)
image = cv2.pyrMeanShiftFiltering(img,20,50)
cv2.imwrite('01shift.jpg' ,image)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imwrite('02gray.jpg' ,gray)
2.自适应均衡化
代码如下(示例):
clahe=cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
img3=clahe.apply(gray)
cv2.imwrite('02zsy_jhh.jpg' ,img3)
# 进行双边滤波操作(单一颗粒25 150 150)
sblb = cv2.bilateralFilter(img3, 25, 100, 100);
#sblb = cv2.GaussianBlur(img2,(13,13), 0)
cv2.imwrite('03sblb.jpg',sblb)
3.阈值化
ret, thresh = cv2.threshold(sblb,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imwrite('04otsu.jpg',thresh)
4.形态学处理
kerne0 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(20,20)) #返回一个特定大小与形状的结构元素用于形态学操作,构造卷积核
thresh0 = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,kerne0)
cv2.imwrite('05xtx.jpg',thresh0)
5.确定形态学参数
kernel = np.ones((9,9),np.uint8)
opening = cv2.morphologyEx(thresh0,cv2.MORPH_OPEN,kernel, iterations = 2)
6.确定背景区域
sure_bg = cv2.dilate(opening,kernel,iterations=3)
cv2.imwrite('06bg.jpg',sure_bg)
7.寻找前景区域
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
cv2.imwrite('07dist.jpg',dist_transform)
ret, sure_fg = cv2.threshold(dist_transform,0.3*dist_transform.max(),255,0)
cv2.imwrite('08fg.jpg',sure_fg)
8.寻找未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
cv2.imwrite('09un.jpg',unknown)
# 标记标签
ret, markers = cv2.connectedComponents(sure_fg)
# 让每个标签+1,保证从背景开始是1
markers = markers+1
# 从0开始标记未知区域
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [36,255,12]
cv2.imwrite('10result.jpg' ,img)
cv2.namedWindow('img',cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
9.完整代码如下
import numpy as np
import cv2 as cv2
from matplotlib import pyplot as plt
#读取图像 灰度化
img = cv2.imread('001.jpg')
#均值漂移,沿时间轴找出颜色空间的峰值分布,彩色图像分割(中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域)
image = cv2.pyrMeanShiftFiltering(img,20,50)
cv2.imwrite('01shift.jpg' ,image)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imwrite('02gray.jpg' ,gray)
#自适应均衡化
clahe=cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
img3=clahe.apply(gray)
cv2.imwrite('02zsy_jhh.jpg' ,img3)
# 进行双边滤波操作(单一颗粒25 150 150)
sblb = cv2.bilateralFilter(img3, 25, 100, 100);
#sblb = cv2.GaussianBlur(img2,(13,13), 0)
cv2.imwrite('03sblb.jpg',sblb)
#阈值化
ret, thresh = cv2.threshold(sblb,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imwrite('04otsu.jpg',thresh)
#形态学处理
kerne0 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(20,20)) #返回一个特定大小与形状的结构元素用于形态学操作,构造卷积核
thresh0 = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,kerne0)
cv2.imwrite('05xtx.jpg',thresh0)
# 确定形态学参数
kernel = np.ones((9,9),np.uint8)
opening = cv2.morphologyEx(thresh0,cv2.MORPH_OPEN,kernel, iterations = 2)
# 确定背景区域
sure_bg = cv2.dilate(opening,kernel,iterations=3)
cv2.imwrite('06bg.jpg',sure_bg)
# 寻找前景区域
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
cv2.imwrite('07dist.jpg',dist_transform)
ret, sure_fg = cv2.threshold(dist_transform,0.3*dist_transform.max(),255,0)
cv2.imwrite('08fg.jpg',sure_fg)
# 寻找未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
cv2.imwrite('09un.jpg',unknown)
# 标记标签
ret, markers = cv2.connectedComponents(sure_fg)
# 让每个标签+1,保证从背景开始是1
markers = markers+1
# 从0开始标记未知区域
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [36,255,12]
cv2.imwrite('10result.jpg' ,img)
cv2.namedWindow('img',cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。