如果我们想从图像的其余部分中提取或定义某些内容, 例如。从背景中检测到物体, 我们可以将图像分解为多个片段, 在其中可以进行更多处理。通常称为分割.
形态学操作是基于图像形状的一些简单操作。通常在二进制图像上执行。两种基本的形态学算子是侵蚀和膨胀。有关膨胀和侵蚀的基本了解, 请参阅此文章.
为了进行处理, 我们将使用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 DS课程。
评论前必须登录!
注册