如果我们想从图像的其余部分中提取或定义某些内容, 例如。从背景中检测到物体, 我们可以将图像分解为多个片段, 在其中可以进行更多处理。通常称为分割.
形态学操作是基于图像形状的一些简单操作。通常在二进制图像上执行。两种基本的形态学算子是侵蚀和膨胀。有关膨胀和侵蚀的基本了解, 请参阅此文章.
为了进行处理, 我们将使用OTSU的阈值算法, 该算法可消除由于噪声或图像中任何其他不规则性造成的过度分割结果, 并使用OpenCV实现。
方法:
- 用一种颜色(或强度)标记我们确定为前景或对象的区域, 用另一种颜色标记我们确定为背景或非对象的区域。
- 最后, 我们不确定任何区域, 将其标记为0。这就是我们的标记。然后应用分水岭算法。
- 然后, 我们的标记将使用给定的标签进行更新, 并且对象的边界的值为-1。
输入图片:
文章图片
# Python program to transform an image using
# threshold.
import numpy as np
import cv2
from matplotlib import pyplot as plt# Image operation using thresholding
img = cv2.imread( 'c4.jpg' )gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, thresh = cv2.threshold(gray, 0 , 255 , cv2.THRESH_BINARY_INV +
cv2.THRESH_OTSU)
cv2.imshow( 'image' , thresh)
输出:
文章图片
此输出显示图像通过阈值运算进行了变换, 其中前景仍然包含一些噪声。
现在, 我们需要去除图像中所有小的白噪声, 即前景。为此, 我们可以使用形态学封闭。要去除前景对象中的任何小孔, 我们可以使用形态学封闭。为了获得背景, 我们对图像进行了放大。膨胀将对象边界增加到背景。
让我们看一下代码:
# Noise removal using Morphological
# closing operation
kernel = np.ones(( 3 , 3 ), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations = 2 )# Background area using Dialation
bg = cv2.dilate(closing, kernel, iterations = 1 )# Finding foreground area
dist_transform = cv2.distanceTransform(closing, cv2.DIST_L2, 0 )
ret, fg = cv2.threshold(dist_transform, 0.02
* dist_transform. max (), 255 , 0 )cv2.imshow( 'image' , fg)
输出:
文章图片
从输出图像中, 我们可以得出结论, 使用闭合操作可以去除小孔, 并确保结果中前景中的任何区域确实是前景。
参考:
https://docs.opencv.org/3.3.1/d3/db4/tutorial_py_watershed.html
【使用Python中的形态学操作进行图像分割】首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。
推荐阅读
- 使用OpenCV进行图像翻译|Python
- 使用OpenCV实现图像金字塔示例|Python
- 冬奥快结束了还没有抢到冰墩墩(程序员一招让你不用排队不用愁!)
- PHP 基于 SW-X 框架,搭建高性能API架构
- 北亚数据恢复NTFS文件系统误操作导致raid5阵列中的分区被格式化的逆向操作服务器数据恢复方法
- Netty 简介《Netty In Action》 #yyds干货盘点#
- 肝魂一晚上总结(全网最全最细手把手教你PyQt5安装与使用??《??记得收藏??》)
- OpenHarmony移植案例(如何适配服务启动引导部件bootstrap_lite)
- 回顾2021 Github最受欢迎的前端项目,谷歌 zx 位居榜首!