15、计算机视觉的实际应用与Mahotas库使用

计算机视觉的实际应用与Mahotas库使用

1. 计算机视觉实际应用

1.1 图像中条形码的检测

条形码是一种信息的可视化表示方式,便于特定机器理解。下面介绍如何从静态图像中检测简单的平行线格式条形码:
1. 读取源图像

import numpy as np
import cv2
image=cv2.imread('/home/pi/book/dataset/barcode.jpeg', 1)
input = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  1. 计算水平和垂直导数并求差
hor_der = cv2.Sobel(input, ddepth=-1, dx=1, dy=0, ksize = 5)
ver_der = cv2.Sobel(input, ddepth=-1, dx=0, dy=1, ksize=5)
diff = cv2.subtract(hor_der, ver_der)
  1. 转换为8位无符号整数数组
diff = cv2.convertScaleAbs(diff)
  1. 应用高斯模糊去除噪声
blur = cv2.GaussianBlur(diff, (3, 3), 0)
  1. 将图像转换为二值图像
ret, th = cv2.threshold(blur, 225, 255, cv2.THRESH_BINARY)
  1. 膨胀图像
dilated = cv2.dilate(th, None, iterations = 10)
  1. 进行形态学腐蚀操作
eroded = cv2.erode(dilated, None, iterations = 15)
  1. 查找所有轮廓
(contours, hierarchy) = cv2.findContours(eroded, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  1. 找到最大轮廓
areas = [cv2.contourArea(temp) for temp in contours]
max_index = np.argmax(areas)
largest_contour = contours[max_index]
  1. 绘制边界矩形
x, y, width, height = cv2.boundingRect(largest_contour)
cv2.rectangle(image, (x, y), (x+width, y+height),(0,255,0), 2)
cv2.imshow('Detected Barcode',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是条形码检测的流程图:

graph TD;
    A[读取源图像] --> B[计算水平和垂直导数并求差];
    B --> C[转换为8位无符号整数数组];
    C --> D[应用高斯模糊去除噪声];
    D --> E[将图像转换为二值图像];
    E --> F[膨胀图像];
    F --> G[进行形态学腐蚀操作];
    G --> H[查找所有轮廓];
    H --> I[找到最大轮廓];
    I --> J[绘制边界矩形];

1.2 实现色度键效果

色度键效果,也称为色度键合成,常用于电影制作和新闻直播中的天气预报等。以下是实现步骤:
1. 导入所需库并初始化视频捕获对象

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
  1. 设置USB网络摄像头的分辨率
cap.set(3, 640)
cap.set(4, 480)
  1. 读取背景图像
bg = cv2.imread('/home/pi/book/dataset/bg.jpg', 1)
  1. 循环读取网络摄像头的帧
while True:
    ret, frame = cap.read()
  1. 将图像转换为HSV颜色空间并计算掩码
hsv=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
image_mask=cv2.inRange(hsv, np.array([40, 50, 50]), np.array([80, 255, 255]))
  1. 将掩码应用于背景图像
bg_mask=cv2.bitwise_and(bg, bg, mask=image_mask)
  1. 提取前景
fg_mask=cv2.bitwise_and(frame, frame, mask=cv2.bitwise_not(image_mask))
  1. 添加背景和前景并显示结果
cv2.imshow('Output', cv2.add(bg_mask, fg_mask))
if cv2.waitKey(1) == 27:
    break
cv2.destroyAllWindows()
cap.release()

以下是色度键效果实现的步骤列表:
|步骤|操作|
|----|----|
|1|导入所需库并初始化视频捕获对象|
|2|设置USB网络摄像头的分辨率|
|3|读取背景图像|
|4|循环读取网络摄像头的帧|
|5|将图像转换为HSV颜色空间并计算掩码|
|6|将掩码应用于背景图像|
|7|提取前景|
|8|添加背景和前景并显示结果|

2. Mahotas库的使用

2.1 Mahotas库简介

Mahotas是一个用于图像处理和计算机视觉相关任务的Python库,由Luis Pedro开发。它用C++实现,操作NumPy数组,并且有简洁的Python 3接口。目前Mahotas有超过100个用于图像处理和计算机视觉的函数,并且每个版本都会增加新功能和提升性能。

2.2 安装Mahotas

在树莓派上安装Mahotas可以使用以下命令:

pip3 install mahotas

将Mahotas的组件永久添加到PATH变量的步骤如下:
1. 打开 ~/.profile 文件进行编辑:

nano ~/.profile
  1. 在文件末尾添加以下行:
PATH='$PATH:/home/pi/.local/bin'
  1. 重启树莓派:
sudo reboot

验证Mahotas是否安装成功可以使用以下命令:

python3 -c 'import mahotas'

2.3 读取图像和内置图像

Mahotas有许多内置图像,可以使用以下代码加载和显示:

import matplotlib.pyplot as plt
import mahotas
photo = mahotas.demos.load('luispedro')
plt.imshow(photo)
plt.axis('off')
plt.show()

也可以以灰度模式加载和显示图像:

photo = mahotas.demos.load('luispedro', as_grey=True)
plt.imshow(photo, cmap='gray')

还可以加载其他库图像或读取磁盘上的图像:

photo = mahotas.demos.load('nuclear')
photo = mahotas.demos.load('lena')
photo = mahotas.demos.load('DepartmentStore')
photo= mahotas.imread('/home/pi/book/dataset/4.1.01.tiff')

2.4 图像阈值处理

可以使用Mahotas中的函数对灰度图像进行阈值处理,例如Otsu二值化:

import matplotlib.pyplot as plt
import numpy as np
import mahotas
photo = mahotas.demos.load('luispedro', as_grey=True)
photo = photo.astype(np.uint8)
T_otsu = mahotas.otsu(photo)
plt.imshow(photo > T_otsu, cmap='gray')
plt.axis('off')
plt.show()

也可以使用Riddler - Calvard方法进行阈值处理:

T_rc = mahotas.rc(photo)
plt.imshow(photo > T_rc, cmap='gray')

2.5 距离变换

距离变换是一种形态学操作,可以使用 mahotas.distance() 函数计算:

import matplotlib.pyplot as plt
import numpy as np
import mahotas
f = np.ones((256, 256), bool)
f[64:191, 64:191] = False
plt.subplot(121)
plt.imshow(f, cmap='gray')
plt.title('Original Image')
dmap = mahotas.distance(f)
plt.subplot(122)
plt.imshow(dmap, cmap='gray')
plt.title('Distance Transform')
plt.show()

2.6 颜色空间转换

可以将RGB图像转换为棕褐色:

import matplotlib.pyplot as plt
import mahotas
photo = mahotas.demos.load('luispedro')
photo = mahotas.colors.rgb2sepia(photo)
plt.imshow(photo)
plt.axis('off')
plt.show()

2.7 结合Mahotas和OpenCV

可以结合OpenCV和Mahotas处理图像,例如对实时视频帧进行Otsu二值化:

import cv2
import numpy as np
import mahotas as mh
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    T_otsu = mh.otsu(frame)
    output = frame > T_otsu
    output = output.astype(np.uint8) * 255
    cv2.imshow('Output', output)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()
cap.release()

以下是Mahotas库主要功能的表格总结:
|功能|代码示例|
|----|----|
|读取内置图像| photo = mahotas.demos.load('luispedro') |
|灰度模式读取图像| photo = mahotas.demos.load('luispedro', as_grey=True) |
|读取磁盘图像| photo= mahotas.imread('/home/pi/book/dataset/4.1.01.tiff') |
|Otsu二值化| T_otsu = mahotas.otsu(photo); plt.imshow(photo > T_otsu, cmap='gray') |
|Riddler - Calvard阈值处理| T_rc = mahotas.rc(photo); plt.imshow(photo > T_rc, cmap='gray') |
|距离变换| dmap = mahotas.distance(f); plt.imshow(dmap, cmap='gray') |
|RGB转棕褐色| photo = mahotas.colors.rgb2sepia(photo); plt.imshow(photo) |
|结合OpenCV和Mahotas|见上述代码块|

2.8 Mahotas与其他库对比

为了更好地理解Mahotas库的特点,我们将其与OpenCV在几个关键方面进行对比,如下表所示:
| 对比维度 | Mahotas | OpenCV |
| ---- | ---- | ---- |
| 语言实现 | 主要用C++实现,有Python 3接口 | 多种语言支持,Python接口广泛使用 |
| 功能数量 | 超100个图像处理和计算机视觉函数,持续增加 | 功能丰富,涵盖计算机视觉全领域 |
| 图像读取格式 | 读取和存储彩色图像为RGB格式 | 读取和存储彩色图像为BGR格式 |
| 易用性 | 接口简洁,适合快速实现特定任务 | 功能全面但复杂,学习曲线较陡 |
| 性能 | 新版本性能不断提升 | 性能高效,优化程度高 |

从表格中可以看出,Mahotas在功能上相对聚焦,接口简洁,适合快速实现一些特定的图像处理任务;而OpenCV功能更加全面,在计算机视觉领域应用广泛,但学习和使用的难度相对较大。

2.9 Mahotas的应用场景

Mahotas库由于其自身的特点,在以下几个场景中有着出色的表现:
- 科研项目 :在学术研究中,需要快速验证算法和处理图像数据。Mahotas简洁的接口和丰富的图像处理函数可以帮助研究人员节省时间,专注于算法的实现和验证。例如,在图像分析、模式识别等领域的研究中,Mahotas可以用于图像预处理、特征提取等环节。
- 教育教学 :对于初学者来说,复杂的库可能会增加学习的难度。Mahotas的简单易用性使其成为教学中的理想选择。教师可以使用Mahotas向学生展示图像处理的基本原理和算法,让学生更容易理解和掌握相关知识。
- 小型项目 :在一些小型的图像处理项目中,不需要使用到过于复杂的功能。Mahotas提供的功能足以满足项目的需求,并且可以减少代码的复杂度,提高开发效率。

2.10 总结与展望

通过以上对Mahotas库的介绍,我们了解了它的基本功能、安装方法以及与其他库的对比情况。Mahotas作为一个专注于图像处理和计算机视觉的Python库,具有简洁的接口、不断增加的功能和良好的性能,为开发者提供了一个高效的工具。

在未来的发展中,随着计算机视觉技术的不断进步,Mahotas可能会进一步扩展其功能,支持更多的图像处理算法和应用场景。同时,它也可能会与其他热门的深度学习框架进行更紧密的结合,为开发者提供更强大的工具链。

对于开发者来说,掌握Mahotas库可以为图像处理和计算机视觉项目提供更多的选择和可能性。无论是在科研、教育还是实际项目中,都可以根据具体的需求灵活运用Mahotas库,提高开发效率和项目质量。

以下是Mahotas库使用的整体流程图:

graph LR;
    A[安装Mahotas] --> B[读取图像];
    B --> C{选择处理方式};
    C -->|阈值处理| D[Otsu或Riddler - Calvard];
    C -->|距离变换| E[计算距离变换];
    C -->|颜色空间转换| F[RGB转棕褐色];
    C -->|结合OpenCV| G[实时视频帧处理];
    D --> H[显示结果];
    E --> H;
    F --> H;
    G --> H;

希望本文能够帮助你更好地了解和使用Mahotas库,在图像处理和计算机视觉领域取得更好的成果。如果你有任何问题或建议,欢迎在评论区留言交流。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值