python 图像处理——图像分割及经典案例篇之基于颜色的图像分割

这篇具有很好参考价值的文章主要介绍了python 图像处理——图像分割及经典案例篇之基于颜色的图像分割。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言
作者在第一部分向大家介绍了图像处理的基础知识,第二部分介绍了图像运算和图像增强,接下来第三部分我们将详细讲解图像分割及图像处理经典案例,该部分属于高阶图像处理知识,能进一步加深我们的理解和实践能力。图像分割是将图像分成若干具有独特性质的区域并提取感兴趣目标的技术和过程,它是图像处理和图像分析的关键步骤。主要分为基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法和基于特定理论的分割方法。这篇文章将详细讲解基于颜色的图像分割方法。

一、基于颜色的图像分割

颜色分割是图像处理中的一种重要技术,它可以将图像中的不同颜色分割出来,用于目标检测、图像识别等应用场景。

颜色分割的算法原理比较简单,它通常基于颜色空间的变换来实现。常用的颜色空间有RGB、HSV、LAB等,其中HSV颜色空间比较适合颜色分割任务。HSV颜色空间将颜色分成三个通道:色调(Hue)、饱和度(Saturation)和亮度(Value)。

  • 色调:表示颜色的种类或类型,例如红色、蓝色、绿色等。
  • 饱和度:表示颜色的纯度,越饱和的颜色越鲜艳,反之亦然。
  • 亮度:指颜色的明暗程度。在颜色中,亮度越高,颜色就越明亮;亮度越低,颜色就越暗淡。

颜色分割的基本思路是通过阈值来分割不同颜色的像素。具体地,我们可以将图像从RGB颜色空间转换到HSV颜色空间,然后选择合适的阈值(通常是色调、饱和度、亮度的最大值最小值),将图像分成黑白两部分。

在opencv hsv颜色空间中

  • 色调(Hue)的最大值是179度,最小值是0度,代表了颜色在色轮上的位置。

  • 饱和度(Saturation)的最大值是255,最小值是0,代表了颜色的纯度和灰度。

  • 亮度(Brightness)的最大值是255,最小值是0,代表了颜色的明暗程度。

实现步骤
基于上述算法原理,我们可以进行如下步骤来实现颜色分割:

  1. 将图像从RGB颜色空间转换到HSV颜色空间。
  2. 分别计算色调、饱和度、亮度的最大值和最小值
  3. 设置阈值,将图像分割成黑白两部分。
  4. 使用形态学操作去除噪点,得到最终的分割结果。

本文利用OpenCV中的cv2.inRange()函数,对图像中目标进行基于颜色的分割。

mask = cv2.inRange(src, lowerb, upperb[, dst])

— src 参数是输入图像,可以是单通道或多通道的,数据类型为 np.uint8
— mask是输出图像,为单通道图像(二值图像),数据类型和输入图像相同
—lowerb 是指定的下限,类型为 Scalar,可以是单个值或者一个包含多个值的元组或列表
—upperb 是指定的上限,类型为 Scalar,可以是单个值或者一个包含多个值的元组或列表

注:
mask代表了与指定颜色范围匹配的像素点的位置信息,即在指定颜色范围内的像素点在二值图像中对应的像素值为255,不在指定颜色范围内的像素点在二值图像中对应的像素值为0。因此,通过使用这个掩膜,我们可以选择性地对图像进行操作,只对指定颜色范围内的像素点进行处理,而不影响其他像素点

下面是基于上述算法原理实现简单的颜色分割代码(掩码自己给定范围):

import cv2
import numpy as np

# 读入图片
img = cv2.imread( "C:/Users/Administrator/Desktop/flower.png")

# 转换颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义绿色范围
lower_green = np.array([40, 50, 50])
upper_green = np.array([90, 255, 255])

# 定义黄色范围
lower_yellow = np.array([15, 50, 50])
upper_yellow = np.array([40, 255, 255])

# 根据颜色范围创建掩码
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)

# 合并掩码
mask = cv2.bitwise_or(mask_green, mask_yellow)

# 应用掩码
result = cv2.bitwise_and(img, img, mask=mask)

# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图1-1所示,图中较好的分割出了向日葵,但草地部分也被分割了出来
python 图像处理——图像分割及经典案例篇之基于颜色的图像分割
以下是一些常见颜色的HSV大致范围:

红色:(0, 70, 50) - (10, 255, 255) 或者 (156, 70, 50) - (179, 255, 255)

橙色:(10, 70, 50) - (25, 255, 255)

黄色:(25, 70, 50) - (35, 255, 255)

绿色:(35, 70, 50) - (85, 255, 255)

青色:(85, 70, 50) - (100, 255, 255)

蓝色:(100, 70, 50) - (130, 255, 255)

紫色:(130, 70, 50) - (170, 255, 255)

黑色: (0, 0, 0) - (180, 255, 46)

白色:(0, 0, 221) - (180, 30, 255)

灰色:(0,0,46) - (180,43,220)

二、通过观察直方图确定颜色取值范围

当要分割的颜色目标在图像中无较大干扰时,可以通过观察色调(Hue)分量的直方图来确定颜色目标的取值范围,以作为我们分割的界限标准。

代码示例如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")
# BGR图转为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 提取hsv中H通道数据
h = hsv[:, :, 0].ravel()
# 直方图显示
plt.hist(h, 180, [0, 180])
plt.show()

得到直方图,如图2-1所示:
python 图像处理——图像分割及经典案例篇之基于颜色的图像分割
根据上诉所说的常见颜色的HSV范围,直方图中30到70部分出现了大量数据,由此可以确定绿色的H分量上下限为30-70,SV的界限可以根据上诉所提的HSV范围先大致设置,具体可以在提取掩模的时候调整确定

下面通过HSV的绿色界限生成mask掩模。代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# HSV 的下界限
lower_red = np.array([35,70,50])
# HSV 的上界限
upper_red = np.array([70,255,255])

# 通过上下限提取范围内的掩模mask
mask = cv2.inRange(hsv, lower_red, upper_red)

img =  cv2.resize(img,(500,500))
mask = cv2.resize(mask,(500,500))

cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图2-2所示
python 图像处理——图像分割及经典案例篇之基于颜色的图像分割

可以发现,草地的大体轮廓已被提取出来,但在场地上存在许多黑点,这是因为大部分黑点处于暗处,我们可以通过降低V值的下限来滤除掉,在这里V值下限由原来的50调整为15

效果如下:
python 图像处理——图像分割及经典案例篇之基于颜色的图像分割
此时有些黑点已经无法通过V的调整来去除了,我们可以采用膨胀、腐蚀等手段来消除独立的白点或黑点。

消除黑点代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# HSV 的下界限
lower_green = np.array([35,70,15])
# HSV 的上界限
upper_green = np.array([70,255,255])

# 通过上下限提取范围内的掩模mask
mask = cv2.inRange(hsv, lower_green, upper_green)

# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 35))
# 图像闭运算
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2)

img =  cv2.resize(img,(500,500))
mask = cv2.resize(mask,(500,500))

cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如图2-3所示
python 图像处理——图像分割及经典案例篇之基于颜色的图像分割
可以看到黑色的点被消除了,然后我们再使用cv2.bitwise_and()把原图与mask进行位与抠出草地的图片:
python 图像处理——图像分割及经典案例篇之基于颜色的图像分割

颜色替换

通过上面的操作我们已经可以准确的分割出我们指定的颜色了,在次基础上就可以对他的颜色进行更改了,比如改成黄色,这个同样也是要在HSV颜色空间操作的,不过这次就不需要对mask进行闭运算了。

在这里使用createTrackbar函数对hsv进行进行调整

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)

  • trackbarName:可拖动条的名称,字符串类型。
  • windowName:可拖动条所在的窗口名称,字符串类型。
  • value:可拖动条的默认值,整型。
  • count:可拖动条的最大值,整型。
  • onChange:当可拖动条的值发生变化时调用的回调函数,函数类型。

代码如下:

import cv2
import numpy as np

def nothing(x):
    pass
#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")

img = cv2.resize(img,(500,500))
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.imshow("img", img)

# HSV 的下界限
lower_green = np.array([35,70,15])
# HSV 的上界限
upper_green = np.array([70,255,255])

cv2.namedWindow('img2',cv2.WINDOW_NORMAL)

cv2.createTrackbar('H','img2',140,180,nothing)
cv2.createTrackbar('S','img2',100,180,nothing)
cv2.createTrackbar('V','img2',117,180,nothing)
rows,cols,channels = img.shape

while(1):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower_green, upper_green)
    #将制定像素点的数据设置为0, 要注意的是这三个参数对应的值是Blue, Green, Red。
    h = cv2.getTrackbarPos('H', 'img2')
    s = cv2.getTrackbarPos('S', 'img2')
    v = cv2.getTrackbarPos('V', 'img2')
    for r in range(rows):
        for c in range(cols):
            if mask[r, c] == 255:
                hsv.itemset((r, c, 0), hsv.item(r, c, 0) -h)
                hsv.itemset((r, c, 1), hsv.item(r, c, 1) +90-s)
                hsv.itemset((r, c, 2), hsv.item(r, c, 2) +90-v)
    img2 = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    #将图像进行输出,使用show()也是可以显示的。
    img = cv2.resize(img, (500, 500))
    cv2.imshow("img2", img2)
    k = cv2.waitKey(1)&0xFF
    if k == 27: #esc exit
        break

#cv2.waitKey(0)
cv2.destroyAllWindows()

python 图像处理——图像分割及经典案例篇之基于颜色的图像分割

三、总结

本篇博客介绍了如何使用Python与OpenCV进行颜色分割,其中使用了HSV颜色空间和阈值分割的算法。实现颜色分割的步骤包括:读取图像文件、转换颜色空间、计算阈值、分割图像、去除噪点等。通过实例的代码,我们可以更加深入地了解颜色分割的实现过程。文章来源地址https://www.toymoban.com/news/detail-509993.html

到了这里,关于python 图像处理——图像分割及经典案例篇之基于颜色的图像分割的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [Python从零到壹] 七十三.图像识别及经典案例篇之图像去雾ACE算法和暗通道先验去雾算法实现

    十月太忙,还是写一篇吧!祝大家1024节日快乐O(∩_∩)O 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家

    2024年01月17日
    浏览(43)
  • Python Unet ++ :医学图像分割,医学细胞分割,Unet医学图像处理,语义分割

    一,语义分割:分割领域前几年的发展 图像分割是机器视觉任务的一个重要基础任务,在图像分析、自动驾驶、视频监控等方面都有很重要的作用。图像分割可以被看成一个分类任务,需要给每个像素进行分类,所以就比图像分类任务更加复杂。此处主要介绍 Deep Learning-ba

    2024年02月16日
    浏览(59)
  • (数字图像处理MATLAB+Python)第十章图像分割-第一、二节:阈值分割和边界分割

    图像分割 :在对图像的研究和应用中,人们往往仅对图像中的某些目标感兴趣,这些目标通常对应图像中具有特定性质的区域。图像分割是指把一幅图像分成不同的具有特定性质区域的图像处理技术,将这些区域分离提取出来,以便进一步提取特征和理解 图像分割方法多种

    2024年02月16日
    浏览(62)
  • 数字图像处理与Python实现-图像增强经典算法汇总

    本文将对图像增强经典算法做一个简单的汇总。图像增强的经典算法有:像素变换、图像逆变换、幂律变换、对数变换、图像均衡化、对比受限自适应直方图均衡(CLAHE)、对比度拉伸、Sigmoid校正、局部对比度归一化。 转换是将一组输入映射到一组输出的函数,这样每个输入

    2024年02月09日
    浏览(49)
  • python数字图像处理基础(五)——Canny边缘检测、图像金字塔、图像分割

    梯度是什么? 梯度就是变化的最快的那个方向 edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 第一个参数是需要处理的原图像,该图像必须为单通道的灰度图; 第二个参数是阈值1; 第三个参数是阈值2。 原理步骤 1)使用高斯滤波器,以平滑图像,滤除噪

    2024年01月18日
    浏览(44)
  • 【机器学习】最经典案例:房价预测(完整流程:数据分析及处理、模型选择及微调)

    环境:anaconda+jupyter notebook 首先要明白一点: 数据决定模型的上限!数据决定模型的上限!数据决定模型的上限! (重要的事情说三遍。)对于数据的处理在一个完整案例中花费精力的比重应该占到一半以上。 以下分为:数据分析、数据清洗两部分。 数据分析主要包括:查

    2024年02月05日
    浏览(43)
  • Python递归的几个经典案例

    当我们碰到诸如需要求阶乘或斐波那契数列的问题时,使用普通的循环往往比较麻烦,但如果我们使用递归时,会简单许多,起到事半功倍的效果。这篇文章主要和大家分享一些和递归有关的经典案例,结合一些资料谈一下个人的理解,也借此加深自己对递归的理解和掌握一

    2024年02月05日
    浏览(44)
  • Python案例分析|使用Python图像处理库Pillow处理图像文件

    本案例通过使用Python图像处理库Pillow,帮助大家进一步了解Python的基本概念:模块、对象、方法和函数的使用 使用Python语言解决实际问题时,往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理图像:实现读取图像、获取图像信

    2024年02月16日
    浏览(48)
  • 【经典爬虫案例】用Python爬取微博热搜榜!

    目录 一、爬取目标 二、编写爬虫代码 2.1 前戏 2.2 获取cookie 2.3 请求页面 2.4 解析页面 2.5 转换热搜类别 2.6 保存结果 2.7 查看结果数据 三、获取完整源码 您好,我是@马哥python说,一名10年程序猿。 本次爬取的目标是: 微博热搜榜 ​ 分别爬取每条热搜的: 热搜标题、热搜排名

    2024年02月13日
    浏览(44)
  • Python制作经典游戏案例-水果忍者(附源码等文件)

    大家好,我是辣条哥,今天给大家分享一款我以前特爱玩的游戏,水果大战,今天我就教大家使用python把这款游戏制作出来。我们先来看效果 点击跳转文末 相关的一些音乐文件,还有代码文件都在文末直接找辣条拿就行~ 记得给辣条顶一顶支持一下啊~ 当我运行代码这个就是

    2024年02月11日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包