记录mac上图像处理

自适应二值化

import cv2

# 读取图像
image = cv2.imread('/Users/sinkarsenic/Downloads/用所选项目新建的文件夹/2.jpg', 0)  # 使用灰度模式读取图像

# 自适应二值化
adaptive_thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 31, 2)

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Adaptive Thresholding', adaptive_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

自适应二值化是处理光照不均匀或阴影存在的图像时常用的一种方法,自适应二值化考虑了图像不同区域的局部亮度和对比度,使得在光照不均匀或者阴影存在的情况下,也能得到较好的二值化效果。具有以下优点:

  1. 局部适应性:自适应二值化根据图像的局部区域计算阈值,因此能够更好地适应图像中局部光照变化。这意味着即使在图像的不同部分具有不同的光照条件或对比度时,也可以得到准确的二值化结果。

  2. 减少阴影影响:由于自适应二值化考虑了局部光照条件,因此可以减少阴影对二值化结果的影响。在存在阴影的情况下,全局阈值可能无法正确地将阴影部分和目标部分分离,而自适应二值化则可以更好地处理这种情况。

  3. 无需手动调整阈值:与全局阈值相比,自适应二值化无需手动设置全局阈值,而是根据图像的局部统计信息自动计算阈值。这样可以减少用户的主观干预,提高了处理图像的效率和鲁棒性。

  4. 适用性广泛:自适应二值化适用于各种光照条件下的图像处理任务,包括文档扫描、目标检测、图像分割等。它能够处理不同类型的图像,包括自然场景、工业图像等。

  5. 易于实现:Matlab提供了自适应二值化的实现方法,使得应用者可以方便地使用这一技术。只需几行代码就可以对图像进行自适应二值化处理,因此易于实现和集成到应用中。

综上所述,自适应二值化是一种简单且有效的处理光照不均匀或阴影存在的图像的方法,具有较高的实用性和适用性。除了自适应二值化之外,还有一些其他的图像处理技术可以达到类似的效果,尤其是在处理光照不均匀或者阴影存在的情况下。以下是一些常用的方法:

1.局部阈值化(Local Thresholding):与自适应二值化类似,但是不使用局部统计信息来计算阈值,而是将图像分成多个局部区域,然后在每个局部区域内计算阈值。
受到噪声的影响。如果图像中存在噪声,局部阈值化可能会导致阈值计算的不准确性。
计算成本较高。在图像的每个局部区域内计算阈值可能会增加计算成本,特别是对于大型图像或需要实时处理的应用而言。

2.基于梯度的方法(Gradient-based Methods):通过计算图像的梯度或边缘来确定阈值。例如,可以使用Sobel算子或Canny边缘检测来检测图像的边缘,然后应用阈值。
对参数敏感。一些梯度算子(如Sobel)具有参数(如核大小),对于不同的图像和应用,需要调整参数以获得最佳结果。
对噪声敏感。由于梯度算子对噪声比较敏感,因此需要在使用之前对图像进行平滑处理。

  1. 颜色空间转换(Color Space Transformation):有时,将图像从RGB颜色空间转换到其他颜色空间(如HSV或LAB),然后应用阈值化,可以更好地处理光照变化。
    有时并不适用。某些场景下,颜色空间转换可能不适用于处理光照不均匀的图像,尤其是当光照变化不仅仅是亮度的变化时。
    对计算资源要求较高。颜色空间转换可能需要较多的计算资源,特别是对于高分辨率的图像而言。

4基于深度学习的方法(Deep Learning-based Methods):使用深度学习模型(如卷积神经网络)来学习图像的特征并进行二值化。这种方法通常需要大量的标记数据进行训练,但在某些情况下可以提供更好的性能。
需要大量数据和计算资源。深度学习模型通常需要大量的标记数据进行训练,并且在实际应用中可能需要大量的计算资源和时间进行训练和推理。
需要调优。深度学习模型的性能通常受到超参数选择、网络结构设计等因素的影响,需要进行调优和优化才能达到最佳性能。

  1. 多阈值分割(Multi-threshold Segmentation):将图像分成多个灰度级别的区域,并为每个区域选择适当的阈值。这种方法适用于图像中存在多个不同亮度或对比度区域的情况。
    需要手动设置阈值。多阈值分割方法通常需要手动设置阈值,这可能需要一定的领域知识和试验来选择合适的阈值。
    对参数敏感。选择不同的阈值可能会导致不同的分割结果,因此需要谨慎选择阈值。

这些方法中的每一种都有其适用的场景和局限性,具体选择取决于图像特点和需求。在实际应用中,通常需要尝试不同的方法并根据结果进行调整和优化。

霍夫变换

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

# 读取图像
image = cv2.imread('/Users/sinkarsenic/Downloads/用所选项目新建的文件夹/1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用霍夫变换检测直线
lines = cv2.HoughLines(gray, 1, np.pi/180, threshold=360)  # 调整threshold参数

# 构建霍夫空间图像
h, w = gray.shape[:2]
hough_space = np.zeros((h, w), dtype=np.uint8)
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv2.line(hough_space, (x1, y1), (x2, y2), (255), 2)

# 显示霍夫空间
plt.imshow(hough_space, cmap='gray')
plt.title('Hough Space')
plt.xlabel('Theta (radians)')
plt.ylabel('Rho (pixels)')
plt.show()

除了霍夫变换之外,还有一些其他方法可以用于检测图像中的几何形状。

  1. 边缘检测 + 轮廓检测
    边缘检测:边缘检测是图像处理中常用的一种方法,用于检测图像中的边缘或者梯度变化。常见的边缘检测算子包括Sobel、Prewitt、Canny等。这些算子会对图像进行滤波操作,然后计算梯度来找到边缘。
    轮廓检测:在边缘检测之后,可以使用轮廓检测算法来识别图像中的轮廓。常用的轮廓检测算法包括基于边缘的方法、基于区域的方法等。轮廓检测可以找到图像中的闭合轮廓,并计算其几何属性,如面积、周长、包围框等。
    对于复杂图像,边缘检测可能会受到噪声和纹理的干扰,导致检测到的边缘不准确。
    轮廓检测需要对边缘进行后处理,提取出闭合的轮廓,并且对于不同形状的轮廓需要采用不同的处理方法,增加了算法的复杂性。

  2. 形态学处理
    形态学处理是一种基于图像形状的非线性操作,主要用于改变图像中对象的形状和结构。形态学操作包括膨胀、腐蚀、开运算、闭运算等。膨胀操作可以使对象增大,腐蚀操作可以使对象缩小,开运算可以消除小的目标物体,并平滑大的物体边界,闭运算可以填充目标物体的小孔,连接较小的目标物体。
    形态学处理通常需要调整参数来适应不同的图像和场景,对于复杂的图像可能需要进行多次试验才能获得最佳结果。
    形态学处理可能会改变图像中的像素值分布,导致对后续处理步骤的影响。

  3. 基于特征匹配的方法
    基于特征匹配的方法是一种利用图像中的特征点或特征描述符进行匹配的方法。首先,通过检测图像中的特征点(如Harris角点、SIFT特征点等)或特征描述符(如SIFT、SURF、ORB等)来提取图像的局部特征。然后,利用这些特征点或描述符进行匹配,找到在不同图像中相似的特征点对或者特征描述符。通过匹配的特征点或描述符,可以进行图像配准、目标跟踪、图像拼接等任务。
    特征匹配方法通常需要大量的特征点,对计算资源要求较高。
    对于光照变化较大或者遮挡严重的图像,特征匹配方法可能会失效或者产生误匹配。

这些方法在图像处理和计算机视觉领域中都有着广泛的应用,方法各有优劣,具体选择取决于应用场景、图像特性以及对结果的要求。在实际应用中,通常需要根据具体情况进行选择和调整,甚至组合多种方法来获得最佳的检测效果。

特征匹配


import cv2
import numpy as np

# 读取待匹配的图像和模板图像
img1 = cv2.imread('/Users/sinkarsenic/Downloads/用所选项目新建的文件夹/1.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('/Users/sinkarsenic/Downloads/用所选项目新建的文件夹/WechatIMG168.jpg', cv2.IMREAD_GRAYSCALE)

# 使用ORB特征检测器
orb = cv2.ORB_create()

# 在两个图像上检测特征点和特征描述符
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

# 使用暴力匹配器进行特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)

# 将匹配结果按照距离排序
matches = sorted(matches, key=lambda x: x.distance)

# 画出前几个匹配结果
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

# 显示匹配结果
cv2.imshow('Matches', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()

视频帧提取

使用MATLAB截取视频帧有几个优点:

  1. MATLAB的图像处理工具箱:MATLAB提供了丰富的图像处理工具箱,可以方便地对截取的视频帧进行各种处理和分析,例如图像增强、边缘检测、目标识别等。

  2. 易于使用:MATLAB具有简洁而直观的语法,使得截取视频帧和进行图像处理变得容易。MATLAB的交互式环境还使得用户可以快速测试和调整代码,实现所需的功能。

  3. 集成性:MATLAB是一种多功能的科学计算环境,具有丰富的工具箱和函数,可用于处理视频数据、分析数据和进行可视化。因此,截取视频帧后可以立即在MATLAB中进行进一步的处理和分析,无需将数据转移到其他平台。

  4. MATLAB的丰富文档和社区支持:MATLAB具有广泛的文档和在线资源,用户可以轻松查找所需的函数、示例代码和教程。此外,MATLAB拥有庞大的用户社区,用户可以在社区中获取支持和交流经验。
    综上所述,使用MATLAB截取视频帧可以利用其丰富的图像处理工具箱和易用性,快速实现视频帧的截取和处理,并与其他工具集成,以满足各种科学计算和工程应用的需求。
    除了使用Matlab还有一些方法虽然都可以用来截取视频帧,但每种方法都有其局限性和缺点:

  5. 使用OpenCV
    如果视频较长,逐帧读取和保存可能会占用大量的存储空间。
    对于大型视频文件,读取和处理速度可能较慢,尤其是在资源受限的环境下。
    OpenCV在处理一些特定视频格式时可能存在兼容性问题。
    在这里插入图片描述

  6. 使用FFmpeg
    对于不熟悉命令行操作的用户来说,学习和使用FFmpeg可能有一定的学习曲线。
    由于FFmpeg是一个独立的命令行工具,需要在系统中安装,并且需要正确配置命令行参数才能实现所需功能。
    在这里插入图片描述

这个命令将视频文件 input_video.mp4 每秒提取一帧,并保存为图像文件。
3. 使用其他编程语言和库
其他编程语言和库可能没有像OpenCV或FFmpeg那样成熟的视频处理功能,可能需要额外的工作来实现截取视频帧的功能。
无论使用哪种方法,判断截取视频帧的好坏通常取决于以下几个因素:

  • 截取精度:截取的视频帧是否清晰,是否保留了视频中的重要信息。
  • 截取效率:截取视频帧的速度是否足够快,以满足实际需求。
  • 存储空间:截取的视频帧是否占用了过多的存储空间,是否需要进行压缩或其他处理以减少存储成本。
  • 易用性:截取视频帧的方法是否易于使用和集成到现有的工作流程中。
    综合考虑以上因素,可以评估截取视频帧的好坏,并根据实际需求选择合适的方法。
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sink Arsenic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值