建设公司网站有用吗,网络艺术设计是什么,互联网网站建设水平,哈密市建设局网站目录
一 分水岭算法
二 利用OpenCV实现分水岭算法的过程
三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面#xff0c;其中高强度表示山峰和山丘#xff0c;而低强度表示山谷。首先#xff0c;开始用不同颜色的水#xff08;标签#xff09;填充每个孤立的山…目录
一 分水岭算法
二 利用OpenCV实现分水岭算法的过程
三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面其中高强度表示山峰和山丘而低强度表示山谷。首先开始用不同颜色的水标签填充每个孤立的山谷局部最小值。随着水位的上升根据附近的山峰梯度来自不同山谷的水显然具有不同的颜色将开始合并。为了避免这种情况我们需要在水汇合的位置建造水坝或者屏障。如果继续注水和建造屏障的工作直到所有的山峰都在水下。然后之前创建的屏障会提供细分的结果。这就是分水岭背后的“哲学”。 利用OpenCV实现分水岭算法的过程如下
①首先找到前景的近似估计值。可以使用 Otsu 的二值化操作实现。
②通过形态学处理对原始的图像img进行降噪操作。
注意靠近物体中心的区域是前景而远离物体的区域是背景。不确定的唯一区域是硬币的边界区域。
③通过膨胀操作获取“确定的背景区域Background region。
④利用距离变换函数cv2.distanceTransform()对图像进行处理并对其结果进行阈值分割得到”确定前景区域Front reign“。
⑤获取未知的区域UN。UN img - Background region - Front reign。
⑥利用cv.connectedComponents()实现图像的标注工作和对标注结果进行修正。
⑦使用分水岭分割函数cv.watershed()完成对图像的分割。
二 利用OpenCV实现分水岭算法的过程
①Otsu 的二值化操作的结果
img cv2.imread(img_path)
im img.copy()
gray cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) ②图像降噪操作的结果。
kernel np.ones((3, 3), np.uint8)
opening cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations2) ③确定的背景区域Background region。
sure_bg cv2.dilate(opening, kernel, iterations3) ④确定的前景区域。
dist_transform cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
sure_fg np.uint8(sure_fg) ⑤unknown区域。
unknown cv2.subtract(sure_bg, sure_fg) ⑥利用cv.connectedComponents()实现图像的标注并且对标注结果进行修正。
ret, markers cv2.connectedComponents(sure_fg)
# Add one to all labels so that sure background is not 0, but 1
markers markers 1
# Now, mark the region of unknown with zero
markers[unknown 255] 0
⑦使用分水岭分割函数cv.watershed()完成对目标的分割处理。
markers cv2.watershed(im, markers)
# The boundary region will be marked with -1.三 实践
代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r cv2.split(img)img_rgb cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):img cv2.imread(img_path)im img.copy()gray cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU)# noise removalkernel np.ones((3, 3), np.uint8)opening cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations2)# sure background areasure_bg cv2.dilate(opening, kernel, iterations3)# sure foreground areadist_transform cv2.distanceTransform(opening, cv2.DIST_L2, 5)ret, sure_fg cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)sure_fg np.uint8(sure_fg)unknown cv2.subtract(sure_bg, sure_fg)# Marker labellingret, markers cv2.connectedComponents(sure_fg)# Add one to all labels so that sure background is not 0, but 1markers markers 1# Now, mark the region of unknown with zeromarkers[unknown 255] 0markers cv2.watershed(im, markers)# The boundary region will be marked with -1.im[markers -1] [255, 255, 0]fig plt.figure(figsize(10, 10))img dealImg(img)im dealImg(im)titles [im, OTSU, open, sure_bg, sure_fg, unknown, result_im]images [img, thresh, opening, sure_bg, sure_fg, unknown, im]for i in range(7):plt.subplot(2, 4, i 1), plt.imshow(images[i], gray)plt.title({}.format(titles[i]), fontsize20, hacenter)plt.xticks([]), plt.yticks([])#plt.subplots_adjust(leftNone, bottomNone, rightNone, topNone, wspace0.3, hspace0)# plt.tight_layout()plt.show()fig.savefig(test_results.jpg, bbox_inchestight)
if __name__ __main__:dealImageResult(test.jpg)pass
效果图 从上图中可以看出对于某些硬币它们接触的区域可以被正确分割开而对于某些硬币则没有分割开。 前文回顾 入门篇目录 数字图像处理入门篇一 图像的数字化与表示 数字图像处理入门篇二 颜色空间 数字图像处理入门篇三 灰度化 数字图像处理入门篇四 像素关系 数字图像处理入门篇五 图像数据预处理之颜色空间转换 数字图像处理入门篇六 图像数据预处理之坐标变化 数字图像处理入门篇七 图像数据预处理之灰度变化 数字图像处理入门篇八 图像数据预处理之直方图 数字图像处理入门篇九 图像数据预处理之滤波 数字图像处理入门篇十 边缘检测 数字图像处理入门篇十一 形态学处理 数字图像处理入门篇十二 自适应阈值分割 数字图像处理入门篇十三 仿射变换 数字图像处理入门篇十四 透视变换 实践篇目录 数字图像处理实践篇一 将图像中的指定目标用bBox框起来吧 数字图像处理实践篇二 画出图像中目标的轮廓 数字图像处理实践篇三 将两张图像按照指定比例融合 数字图像处理实践篇四 图像拼接基于SIFT特征点和RANSAC方法 数字图像处理实践篇五 使用Grabcut算法进行物体分割 数字图像处理实践篇六 利用hough变换进行直线检测 数字图像处理实践篇七 利用霍夫变换进行圆环检测 数字图像处理实践篇八 Harris角点检测 数字图像处理实践篇九 基于边缘的模板匹配 数字图像处理实践篇十 图像质量检测 数字图像处理实践篇十一 图像中的条形码解析 数字图像处理实践篇十二 基于小波变换的图像降噪 数字图像处理实践篇十三 数据增强之给图像添加噪声 数字图像处理实践篇十四 图像金字塔 数字图像处理实践篇十五 基于傅里叶变换的高通滤波和低通滤波