使用Python和OpenCV进行视觉图像分割

简介🎁

在图像处理领域,图像分割是一项基础且关键的技术,它涉及到将图像划分为若干个具有特定属性的区域。本文将通过一个实践项目,展示如何使用Python编程语言,结合OpenCV库,对一张玫瑰花的图片进行图像分割。这个项目不仅能够帮助我们理解图像分割的基本概念,还能够提供一个实际的编程示例。

0dayNu1L-CSDN博客

目录

简介🎁

环境准备🚚

项目步骤💂‍♀️

一:选取样本区域

二:计算标准差

三:建立模板图像空间

四:根据模板图像空间分割原图像

显示结果🥘

[完整代码 🍠](#完整代码 🍠)

结论💢


环境准备🚚

在开始之前,请确保你的开发环境中已经安装了Python、NumPy、Matplotlib以及OpenCV(即skimageio模块)。这些库可以通过pip进行安装。

项目步骤💂‍♀️

一:选取样本区域

首先,我们从图像中选取一个区域作为样本。在这个例子中,我们选择了图像中心的一个正方形区域。

python 复制代码
from skimage import data, io
import numpy as np

# 读取图像
image = io.imread('flower.jpg')

# 选取样本区域
height, width, _ = image.shape
roi_size = 100  # 样本区域的边长
roi_center_x = width // 2
roi_center_y = height // 2
roi = image[roi_center_y - roi_size//2:roi_center_y + roi_size//2,
             roi_center_x - roi_size//2:roi_center_x + roi_size//2]

二:计算标准差

接下来,我们计算所选区域红色通道的标准差,这将用于后续的图像分割。

python 复制代码
# 提取红色通道并计算标准差
red_channel = roi[:, :, 0]
mean_value = np.mean(red_channel)
std_dev = np.std(red_channel)

三:建立模板图像空间

基于计算出的标准差,我们建立一个模板图像空间,用于区分图像中的不同区域。

python 复制代码
# 建立模板图像空间
template_image = np.zeros_like(image, dtype='uint8')
for y in range(height):
    for x in range(width):
        if abs(image[y, x, 0] - mean_value) <= std_dev:
            template_image[y, x] = image[y, x]
        else:
            template_image[y, x] = [0, 0, 0]  # 将不符合条件的像素设置为黑色

四:根据模板图像空间分割原图像

最后,我们使用模板图像空间来分割原始图像,得到最终的分割结果。

python 复制代码
# 分割原图像
segmented_image = np.where(template_image != 0, image, 0)

显示结果🥘

使用Matplotlib库,我们可以将原始图像、模板图像以及分割后的图像展示出来,以便进行比较。

python 复制代码
from matplotlib import pyplot as plt

# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.title('Original Image')
plt.imshow(image)
plt.axis('off')

plt.subplot(1, 3, 2)
plt.title('Template Image')
plt.imshow(template_image)
plt.axis('off')

plt.subplot(1, 3, 3)
plt.title('Segmented Image')
plt.imshow(segmented_image)
plt.axis('off')

plt.show()

完整代码 🍠

python 复制代码
from skimage import data, io
from matplotlib import pyplot as plt
import numpy as np
import math

# 读取图像
image = io.imread(r'flower.jpg')

# 一:选取样本区域
# 假设我们选取图像中心的一个正方形区域作为样本区域
height, width, _ = image.shape
roi_size = 100  # 样本区域的边长
roi_center_x = width // 2
roi_center_y = height // 2
roi = image[roi_center_y - roi_size//2:roi_center_y + roi_size//2,
            roi_center_x - roi_size//2:roi_center_x + roi_size//2]

# 提取红色通道
red_channel = roi[:, :, 0]

# 二:计算标准差
mean_value = np.mean(red_channel)
std_dev = np.std(red_channel)

# 三:建立模板图像空间
r1_d = std_dev
template_image = np.zeros_like(image, dtype='uint8')
for y in range(height):
    for x in range(width):
        if abs(image[y, x, 0] - mean_value) <= r1_d:
            template_image[y, x] = image[y, x]
        else:
            template_image[y, x] = [0, 0, 0]  # 将不符合条件的像素设置为黑色

# 四:根据模板图像空间分割原图像
segmented_image = np.where(template_image != 0, image, 0)

# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.title('Original Image')
plt.imshow(image)
plt.axis('off')

plt.subplot(1, 3, 2)
plt.title('Template Image')
plt.imshow(template_image)
plt.axis('off')

plt.subplot(1, 3, 3)
plt.title('Segmented Image')
plt.imshow(segmented_image)
plt.axis('off')

plt.show()

结论💢

通过这个项目,我们学习了如何使用Python和OpenCV进行图像分割。这个过程涉及到了样本区域的选择、标准差的计算、模板图像空间的建立以及最终的图像分割。这个技术在许多领域都有广泛的应用,比如医学影像分析、自动驾驶车辆的视觉系统等。希望这个项目能够为你提供一些启发和帮助。

相关推荐
Polar__Star3 分钟前
golang如何实现Trie前缀树_golang Trie前缀树实现解析
jvm·数据库·python
悟空爬虫-彪哥5 分钟前
2026 Python UI 框架选择指南:从 Streamlit 到 Pyside6 的四层体系
开发语言·python·ui
weixin_408717777 分钟前
SQL中JOIN不同存储引擎表的影响_索引兼容性与查询性能评估
jvm·数据库·python
qq_189807038 分钟前
如何让导航栏的下落动画效果更慢?
jvm·数据库·python
梦无矶8 分钟前
快速设置uv默认源为国内镜像
数据库·redis·后端·python·uv
m0_5150984210 分钟前
HTML函数在低分辨率屏幕能正常编写吗_显示硬件最低适配说明【方法】
jvm·数据库·python
m0_7489203613 分钟前
如何利用宝塔面板设置网站限流策略_防止恶意高并发请求
jvm·数据库·python
bigcarp16 分钟前
windows server 2012上安装EdgeWebView2以支持pywebview项目
python
测试员周周16 分钟前
【CrewAI系列2】CrewAI 环境搭不好?纯小白从零部署指南,10 分钟搞定(命令可复制)
人工智能·python
m0_7349497920 分钟前
C#怎么操作Redis缓存 C#如何用StackExchange.Redis连接和操作Redis数据【数据库】
jvm·数据库·python