python opencv 图像处理进阶篇(一)

简介: python opencv 图像处理进阶篇(一)

色彩空间变换与边缘、轮廓检测


计算机视觉中有三种常用的色彩空间:


  • 灰度色彩空间:除去彩色信息,将其图像转换成灰阶,常用于人脸检测
  • BGR色彩空间:蓝-绿-红色彩空间,每个像素点由一个三元数组表示,数组中每个值代表一个颜色的
  • HSV色彩空间:H(色调),S(饱和度),V(黑暗程度或明亮程度),常用于做图像颜色判定

1.傅里叶变换


这里引入一个概念:


把图像中的像素看成是由不同频率的波(声波)组成,那整个图像就是由不同波叠加得到的。通过波的信号变化强度可以知道图像像素的变化强度(通过像素值乘以卷积核观察像素值变化),从而标记出哪些是噪声区域,哪些是感兴趣区域,分离图像数据。


傅里叶变换:简单说就是通过像素图像乘以卷积核,得到一个新的像素图像(把图像中最明亮的像素放到图像中央,然后以这个像素为中心扩散逐渐变暗,在边缘的像素最暗)


与深度学习中cnn算法有点相似,都是需要乘以一个卷积核来改变数据特征,不同的是,cnn是降维度提取特征值,而傅里叶变换保持图像的维度不变。


1.1高通滤波器


高通滤波器(HPF)检测某个区域的像素,根据目标区域像素与周围像素的亮度差来提升该区域像素的亮度。

使用scipy进行图像转化调用方式如下:

scipy.ndimage.convolve1d(图像, 卷积核, axis=-1, output=None, mode=‘reflect’, cval=0.0, origin=0)

cv.GaussianBlur(图像,卷积核,Size)

具体python实现如下,这里定义了二个不同卷积核:


  import numpy as np
  import cv2 as cv
  from scipy import ndimage
  kernel_3x3=np.array([[-1,-1,-1],
                         [-1,8,-1],
                         [-1,-1,-1]])
  kernel_5x5=np.array([[-1,-1,-1,-1,-1],
                           [-1,1,2,1,-1],
                           [-1,2,4,2,-1],
                           [-1,1,2,1,-1],
                           [-1,-1,-1,-1,-1]])
    img=cv.imread('data.jpg',0)
    k3=ndimage.convolve(img,kernel_3x3)
    k5=ndimage.convolve(img, kernel_5x5)
    blurred=cv.GaussianBlur(img, (11,11), 0)
    g_hpf=img-blurred
    cv.imshow("3x3",k3)
    cv.imshow("5x5",k5)
    cv.imshow("g_hpf", g_hpf)
    cv.waitKey()
    cv.destroyAllWindows()


20210625100653300.png


1.2低通滤波器


低通滤波器与高通滤波器原理相同,将像素与周围像素低亮度差值小于一个特定值时,平滑该像素的亮度,它主要作用用于去噪和模糊化.


2.边缘检测


边缘检测:简单说通过一张图像,识别出图像中的物体或姿态形状。


在opencv中有很多边缘检测的滤波函数:Laplacian()、Sobel()、Scharr(),这些函数方法是将非边缘区域的图像转化为黑色,将边缘区域图像转为白色或其他饱和色。

存在问题:图像中若存在噪声,很容易错误的将噪声识别为边缘

解决办法:在找到边缘之前,先对图像进行模糊处理,blur()、medianBlur()、GaussianBlur()。

注意边缘检测函数与模糊滤波函数都有一个参数Ksize,它表示滤波核对的宽和高


在这里使用Laplacian与medianBlur函数对小姐姐图像进行边缘检测处理,具体流程:


先对图像进行模糊啊化medianBlur(图像,Ksize)

将图像转化为灰度图像

进行边缘检测Laplacian,将其转化为黑色边缘和白色背景的图像

像素数据值归一化,将像素值转化为0到1之间

将得到的检测图像乘以源图像,得到源图像的边缘检测图


    #设定模糊滤波核宽和高
    blurKsize=7
    #设定边缘滤波核宽和高
    edgeKsize=5
    img=cv.imread('data.jpg')
    blurredSrc=cv.medianBlur(img, ksize=blurKsize)
    graySrc=cv.cvtColor(blurredSrc, cv.COLOR_BGR2GRAY)
    cv.Laplacian(graySrc, cv.CV_8U,graySrc,ksize=edgeKsize)
    #归一化转黑白
    normalizedInverseAlpha=(1.0/255)*(255-graySrc)
    #将边缘生成到源图像中
    channels=cv.split(img)
    for channel in channels:
        channel[:]=channel*normalizedInverseAlpha
    cv.imshow("merge",cv.merge(channels))





3.轮廓检测


边缘检测与轮廓检测区别:

边缘检测:是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。

轮廓检测:提取出想要得到的轮廓 轮廓可能是边缘的一部分

关键函数:


cv.threshold(源图像,输出图像,thresh,maxval,type)

thresh:阈值

maxval:源图像像素最大值

type:阈值类型

type逻辑如下:


threshold_type=CV_THRESH_BINARY:
if src(x,y)>threshold:
   dst(x,y) = max_value
else:
   dst(x,y) = 0
threshold_type=CV_THRESH_BINARY_INV:
if src(x,y)>threshold:
   dst(x,y) = 0
else:
   dst(x,y) = max_value
threshold_type=CV_THRESH_TRUNC:
if src(x,y)>threshold:
   dst(x,y) = threshold
else:
   dst(x,y) = src(x,y)
threshold_type=CV_THRESH_TOZERO:
if src(x,y)>threshold:
   dst(x,y) = src(x,y)
else:
   dst(x,y) = 0
threshold_type=CV_THRESH_TOZERO_INV:
if src(x,y)>threshold:
   dst(x,y) = 0
else:
   dst(x,y) = src(x,y)


cv.findContours(阈值输出图像,mode)

mode:轮廓检索模式:

cv2.RETR_EXTERNAL:表示只检测外轮廓

cv2.RETR_LIST:检测的轮廓不建立等级关系

cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE:建立一个等级树结构的轮廓。

具体轮廓流程如下:


cv.threshold设置像素阈值,对图像像素进行分类

cv.findContours检索出轮廓

计算出一个简单的边界框

计算出包围目标的最小矩阵区域


img=cv.pyrDown(cv.imread('data.jpg',cv.IMREAD_UNCHANGED))
ret,thresh=cv.threshold(cv.cvtColor(img,cv.COLOR_BGR2GRAY),127,255,cv.THRESH_BINARY)
contours,hier=cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for c in contours:
        x,y,w,h=cv.boundingRect(c)
        cv.rectangle(img, (x,y), (x+w,y+h), (0,255,0),2)
        #找到最小区域
        rect=cv.minAreaRect(c)
        #计算最小区域坐标
        box=cv.boxPoints(rect)
        #坐标取整
        box=np.int0(box)
        #画出轮廓框
        cv.drawContours(img,[box],0,(0,0,255),3)
        cv.imshow("contours", img)


20210625132528413.png

相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
140 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
1月前
|
计算机视觉 开发者 Python
利用Python进行简单的图像处理
【10月更文挑战第36天】本文将引导读者理解如何使用Python编程语言和其强大的库,如PIL和OpenCV,进行图像处理。我们将从基本的图像操作开始,然后逐步深入到更复杂的技术,如滤波器和边缘检测。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和技能,让你能够更好地理解和操作图像数据。
|
2月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
155 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
2月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
104 2
|
3月前
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
2月前
|
算法 数据可视化 计算机视觉
Python中医学图像处理常用的库
在Python中,医学图像处理常用的库包括:ITK(及其简化版SimpleITK)、3D Slicer、Pydicom、Nibabel、MedPy、OpenCV、Pillow和Scikit-Image。这些库分别擅长图像分割、配准、处理DICOM和NIfTI格式文件、图像增强及基础图像处理等任务。选择合适的库需根据具体需求和项目要求。
97 0
|
2月前
|
数据挖掘 计算机视觉 Python
基于Python的简单图像处理技术
【10月更文挑战第4天】在数字时代,图像处理已成为不可或缺的技能。本文通过Python语言,介绍了图像处理的基本方法,包括图像读取、显示、编辑和保存。我们将一起探索如何使用PIL库进行图像操作,并通过实际代码示例加深理解。无论你是编程新手还是图像处理爱好者,这篇文章都将为你打开一扇新窗,让你看到编程与创意结合的无限可能。
WK
|
4月前
|
计算机视觉 Python
如何使用OpenCV进行基本图像处理
使用OpenCV进行基本图像处理包括安装OpenCV,读取与显示图像,转换图像颜色空间(如从BGR到RGB),调整图像大小,裁剪特定区域,旋转图像,以及应用图像滤镜如高斯模糊等效果。这些基础操作是进行更复杂图像处理任务的前提。OpenCV还支持特征检测、图像分割及对象识别等高级功能。
WK
55 4
|
4月前
|
计算机视觉 开发者 Python
使用Python进行简单图像处理
【8月更文挑战第31天】 本文将介绍如何使用Python编程语言来处理图像。我们将通过代码示例来展示如何读取、显示、编辑和保存图像文件。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供一个清晰的指引,帮助你开始自己的图像处理项目。
|
4月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
700 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
下一篇
DataWorks