分水岭算法实现岩石分割

本文详细介绍了如何使用Python的OpenCV库实现岩石图像的分水岭算法,包括灰度化、自适应均衡化、阈值化、形态学处理等步骤,并展示了完整的代码实例。通过这些步骤,可以有效地分割出岩石的背景、前景和未知区域。
摘要由CSDN通过智能技术生成


前言

分水岭算法是一种图像区域分割法,在分割的过程中,他会把临近像素之间的相似性作为重要的参考依据,从而在空间位置上相近并且灰度值相近的像素点相互连接起来构成一个封闭的轮廓。分水岭算法的常用操作步骤:先彩色图像灰度化,然后再求得梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线。本文将从代码角度拆分还原操作步骤。

岩石原始图片
在这里插入图片描述
岩石分割后的图片
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、引入库

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提供了大量能使我们快速便捷地处理数据的函数和方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FL1623863125

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

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

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

打赏作者

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

抵扣说明:

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

余额充值