用OpenCV进行传统图像分割

这篇具有很好参考价值的文章主要介绍了用OpenCV进行传统图像分割。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 引言

欢迎回来,我的图像处理爱好者们!本文我们将直接进入传统图像分析的新领域——图像分割,这是指将图像分成若干具有相似性质的区域的过程,从数学角度来看,图像分割是将图像划分成互不相交的区域的过程。
闲话少说,我们直接开始吧!

2. 基于阈值的分割

首先介绍的是基于阈值和基于Otsu的分割方法,这是我们进行分割实验的第一步,我们将了解像这样简单而有效的方法是如何根据图像像素的强度值将图像划分为前景和背景两部分的。

但是我们如何科学地决定分割的阈值呢?这就是Otsu方法派上用场的地方。简单地说,这种巧妙的方法通过计算出最大化类间方差的最佳阈值,使其成为自适应阈值选择的优秀工具。

首先从我们的准备工作开始, 导入我们需要的图像处理库:

# Import libraries
from skimage.io import imread, imshow
import matplotlib.pyplot as plt
import numpy as np
from skimage.color import rgb2gray, rgb2hsv
from skimage.filters import threshold_otsu

加载本节测试图像样例,如下:

# Display the image that we will be playing with
original_image = imread('plants.jpg')
plt.figure(figsize=(20,20))
plt.imshow(original_image)
plt.title('Original Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

3. 固定阈值分割

当我们想要对图像进行二值化时,我们执行两步过程,将图像转换为灰度图,然后设置我们想要的任何阈值(通常为0.50),进而将其转换为二值图像:

# Convert the image to grayscale
gray_image = rgb2gray(original_image)
plt.figure(figsize=(20,20))
plt.imshow(gray_image, cmap='gray')
plt.title('Grayscale Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

得到灰度图,结果如下:用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

选择固定阈值,进行二值化,代码如下:

# Convert the grayscale image to binary image using threshold=0.50
threshold = 0.5
binary_image = gray_image<threshold
plt.figure(figsize=(20,20))
plt.imshow(binary_image, cmap='gray')
plt.title('Binary Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

得到二值图效果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

观察上图,可以发现对于前景背景区分度比较明显的图像,通过设置固定的阈值也可以方便的得到我们需要的前景物体。

4. 自适应阈值分割

请注意分析上述图像中原本较亮的部分是如何变黑的,这是因为我们使用了0.50作为阈值。但在Otsu的方法中,我们不必手动设置阈值,我们可以通过调用函数threshold_otsu让Otsu为我们处理这项工作,如下所示:

# Use threshold_otsu to automatically calculate the optimal threshold
threshold = threshold_otsu(gray_image)
print(f"Otsu's Threshold: {threshold:.2f}")
binary_image_otsu  = gray_image < threshold
plt.figure(figsize=(20,20))
plt.imshow(binary_image_otsu, cmap='gray')
plt.title("Binary Image using Otsu's Method", fontsize=20, weight='bold')
plt.axis('off')
plt.show()

结果如下:

Output:
Otsu's Threshold: 0.67

得到二值图的效果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉
看到区别了吗?我们不必为了获得更好的二值化图像而手动地对阈值进行试错。多亏了otsu的方法,为我们节省了大量试错时间!

5. 彩色图像分割

假设我们只想在图像中隔离青色的植物,那么是时候采用另一种令人兴奋的技术了——彩色图像分割!这种方法是二值化的扩展,但这里有一个注意项:我们使用颜色信息来分离对象,而不是像素值强度。当图像中感兴趣的对象拥有独特不同的颜色时,该方法特别有用。

按照惯例,我们还是首先导入我们的样例图像,代码如下:

# Display original image
original_image = imread('plants.jpg')
plt.figure(figsize=(20,20))
imshow(original_image)
plt.title('Original Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

6. 基于RGB颜色空间的图像分割

观察上图,为了只隔离茂盛的绿色植物,我们可以执行简单的分割操作。如果绿色通道值大于红色和蓝色通道值,我们可以使用下面的比较运算符来表示像素为绿色,代码如下:

# Read image using skimage
original_image = imread('plants.jpg')

# Create subplot of 1x2
fig, ax = plt.subplots(1, 2, figsize=(20, 20))

# Plot original image
ax[0].imshow(original_image)
ax[0].set_title('Original Image', fontsize=20, weight='bold')
ax[0].axis('off')

# Get red, green, and blue channels
r = original_image[:, :, 0]
g = original_image[:, :, 1]
b = original_image[:, :, 2]

# Create a mask for green color
mask = (g > r) & (g > b) # adjust these values depending on what you consider to be 'green'

# Create a new image
new_img = original_image.copy()

# Apply mask to all channels
new_img[:, :, 0] = new_img[:, :, 0] * mask
new_img[:, :, 1] = new_img[:, :, 1] * mask
new_img[:, :, 2] = new_img[:, :, 2] * mask

# Plot the green segmented image
ax[1].imshow(new_img)
ax[1].set_title('Green Segmented Image', fontsize=20, weight='bold')
ax[1].axis('off')

# Display the subplot
plt.tight_layout()
plt.show()

结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

7. 美化效果

观察上述右图,虽然我们可以大致得到我们想要的分割结果,但是仔细观察上图中留下了很多无用的白色标记。实质上白色是红色、绿色和蓝色都达到顶峰的颜色。因此,为了阻止这些不想要的因素,我们可以在代码中添加一个白色掩膜,代码如下:

# Create a mask for white color
white_threshold = 180  # adjust this depending on what you consider to be 'white'
white_mask = (r > white_threshold) & (g > white_threshold) & (b > white_threshold)
# Combine the green and white masks
mask = green_mask & ~white_mask  # ~ is the NOT operator
# Create a new image and apply mask
new_img = original_image.copy()
# Apply mask to all channels
new_img[:,:,0] = new_img[:,:,0] * mask
new_img[:,:,1] = new_img[:,:,1] * mask
new_img[:,:,2] = new_img[:,:,2] * mask

# Plot the green segmented image
ax[1].imshow(new_img)
ax[1].set_title('Green Segmented Image', fontsize=20, weight='bold')
ax[1].axis('off');

得到结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

8. 基于HSV颜色空间的图像分割

如上所述,有时在其他颜色空间(如HSV(色调、饱和度、值))中分割颜色更容易。在HSV颜色空间中,不同的颜色排列在一个圆上(色调),因此挑选特定的颜色可能更容易。

让我们显示原始图像的色调、饱和度和值:

# Read image using skimage
original_image = imread('plants.jpg')

# Convert the image to HSV color space
hsv_img = rgb2hsv(original_image)

fig, ax = plt.subplots(1, 3, figsize=(20,20))
ax[0].imshow(hsv_img[:,:,0], cmap='hsv')
ax[0].set_title('Hue', fontsize=20)
ax[1].imshow(hsv_img[:,:,1], cmap='hsv')
ax[1].set_title('Saturation', fontsize=20)
ax[2].imshow(hsv_img[:,:,2], cmap='hsv')
ax[2].set_title('Value', fontsize=20);

结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉

9. 基于H色调的图像分割

由于使用上面的图很难看到强度值的差异,所以让我们使用colorbar函数来分析,代码如下:

plt.imshow(hsv_img[:,:,0], cmap='hsv')
plt.colorbar()

结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉
正如你所看到的,橙色介于0到0.05之间,所以让我们这些值作为阈值:

# Read image using skimage
original_image = imread('plants.jpg')

# Convert the image to HSV color space
hsv_img = rgb2hsv(original_image)

# Create a mask for orange color
# Hue for orange is roughly in the range of 0 - 0.05
# We can play around these values to adapt to our specific color requirement
mask = (hsv_img[:,:,0] > 0) & (hsv_img[:,:,0] < 0.05)

# create a new image and apply mask
new_img = original_image.copy()

new_img[:,:,0] = new_img[:,:,0] * mask
new_img[:,:,1] = new_img[:,:,1] * mask
new_img[:,:,2] = new_img[:,:,2] * mask

# plot the original and segmented images side by side
fig, ax = plt.subplots(1, 2, figsize=(20,10))

ax[0].imshow(original_image)
ax[0].set_title('Original Image', fontsize=20, weight='bold')
ax[0].axis('off')

ax[1].imshow(new_img)
ax[1].set_title('Orange Segmented Image', fontsize=20, weight='bold')
ax[1].axis('off')

plt.show()

结果如下:
用OpenCV进行传统图像分割,图像处理,opencv,计算机视觉
观察上图,我们已经成功地在植物图像中分割出了具有鲜艳色调的橙色植物。

10.总结

哇,我们今天的旅程简直太棒了!我们对图像分割的深入研究无疑为我们如何从图像中提取有意义的信息提供了有效的方法。 希望大家可以通过上述案例,进入到图像处理的神秘领域,感叹相关算法的魅力。文章来源地址https://www.toymoban.com/news/detail-518280.html

到了这里,关于用OpenCV进行传统图像分割的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python+OpenCV+paddleocr基于传统图像处理技术实现车牌识别

    目录 一、前言 二、预处理-提取车牌         1. 转灰度图         2. 顶帽运算         3. Sobel算子提取y方向边缘         4. 自适应二值化         5. 开运算分割(纵向去噪,分隔)         6. 闭运算合并         7. 膨胀/腐蚀         8. 腐蚀

    2024年02月04日
    浏览(50)
  • opencv-29 Otsu 处理(图像分割)

    Otsu 处理是一种用于图像分割的方法,旨在自动找到一个阈值,将图像分成两个类别:前景和背景。这种方法最初由日本学者大津展之(Nobuyuki Otsu)在 1979 年提出 在 Otsu 处理中,我们通过最小化类别内方差或最大化类别间方差的方式来确定最佳阈值。具体步骤如下: 首先,

    2024年02月14日
    浏览(30)
  • OpenCV4图像处理-图像交互式分割-GrabCut

    本文将实现一个与人(鼠标)交互从而分割背景的程序。 用户指定前景的大体区域,剩下为背景区域,还可以明确指出某些地方为前景或者背景,GrabCut算法采用分段迭代的方法分析前景物体形成模型树,最后根据权重决定某个像素是前景还是背景。 算法:GrabCut(img, mask, re

    2024年02月16日
    浏览(44)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(59)
  • 使用openCV进行图像处理

    使用 openCV进行图像处理,又名:学习计算机视觉理论,做 demo(第3 天) 目录 2.1 图像模糊 2.1.1 均值滤波 2.1.2 中值滤波 2.1.3 高斯滤波 2.1.4 案例实现 2.2 图像锐化 2.2.1 图像锐化简介 2.2.2 案例实现 3.1 OpenCV绘图 3.1.1 使用OpenCV绘制各种图形 3.1.2 案例实现 3.2 图像的几何变换 3.2.1 几

    2024年01月22日
    浏览(57)
  • OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG

    视频背景扣除原理:视频是一组连续的帧(一幅幅图组成),帧与帧之间关系密切(GOP/group of picture),在GOP中,背景几乎是不变的,变的永远是前景。 背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术 顾名

    2024年02月15日
    浏览(37)
  • 入门:使用 OpenCV 进行图像处理

    介绍 图像处理是计算机视觉的一个分支,它使用各种算法来处理和分析数字图像。它涉及使用数学或统计操作来为许多应用修改图像,包括但不限于医学和卫星图像以及数字摄影。本文探讨了图像处理的基础知识和该领域中使用的一些技术。 目录 图像处理基础 图像处理的应

    2024年02月08日
    浏览(60)
  • 第一次用用Opencv进行图像处理

    2023.7.06更新 直接放参考链接,完成安装该步骤来,简单高效! 安装教程链接 有一个问题就是第一次安装完成后运行时会报确实某些ddl的错误,关机重启就好啦! ddl的错误解决后可以用以下代码进行测试,测试通过后基本就ok啦,记得改一下图片的地址。 错误2 找不到某个

    2024年02月16日
    浏览(47)
  • “探索图像处理的奥秘:使用Python和OpenCV进行图像和视频处理“

     1、上传图片移除背景后下载。在线抠图软件_图片去除背景 | remove.bg – remove.bg 2、对下载的图片放大2倍。ClipDrop - Image upscaler  3、对放大后的下载照片进行编辑。  4、使用deepfacelive进行换脸。 1)将第三步的照片复制到指定文件夹。C:myAppdeepfakelivetempDeepFaceLive_NVIDIAuserda

    2024年02月16日
    浏览(89)
  • OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)

    本周有机会接触了一点opnev, 在此做一下记录, 最终以 框选出下图箱子为目的( 图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS: 本文参考了好多大佬分享的理论知识, 在此先感谢大佬的分享~~ 首先是梳理一下流程, 下图是

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包