【OpenCV|图像处理】图像与OpenCV基础知识

【OpenCV|图像处理】图像与OpenCV基础知识

前言:“菜大”之前做项目间断的用到过OpenCV,现在回过头来系统学一次,学习过程记录一下。本系列主要是跟着OpenCV官网教程(文章尾部有链接)学习,其中夹杂着“菜大”在做项目中的积累的经验~今天是OpenCV系列学习的开始,主要介绍图像的知识以及OpenCV的基础图像处理。

一、OpenCV简介

OpenCV可以跨平台运行在Windows、Mac、Linux等系统中,同时也有Python、C++、Java等接口,应用范围极广。Python 可以很容易地用 C/C++ 进行扩展,能够用 C/C++ 编写计算密集型代码,并创建可用作 Python 模块的 Python 包装器。

使用opencv-python的优势有:(1)代码与原始 C/C++ 代码一样快,python在后台运行的实际 C++ 代码;(2)用 Python 编写代码比用 C/C++ 更容易,主要愿意是python丰富的第三方库。OpenCV-Python 使用 Numpy,它是一个高度优化的库,用于具有 MATLAB 样式语法的数值运算。 所有 OpenCV 数组结构都与 Numpy 数组相互转换。 这也使得它更容易与其他使用 Numpy 的库集成,例如 SciPy 和 Matplotlib。

1. OpenCV安装

#直接安装
pip install python-opencv
#指定清华镜像安装,国内网站,下载速度更快
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

#python中引入opencv2
import cv2
print(cv2.__version__)
#输出为
4.5.5

2. OpenCV主要模块

OpenCV的模块有很多很多,发展了二十多年,功能已经多到菜大无法一一列举,想要仔细了解的话,建议去opencv官网了解了解,以下是最基础最核心的模块及简单介绍:

  • core: OpenCV核心模块,是其他类的基础,定义基础数据结构和其他模块中基础类。
  • imgproc: 图像处理基础模块,包括图像滤波、颜色空间、几何图像变换等。
  • imgcodecs: 图像文件IO处理,包括读文件、写文件。
  • videoio: 视频IO处理,包括视频捕获、编码与解码器。
  • highgui: opencv提供创建UI界面模块,包括创建可视化窗口、捕获鼠标键盘活动等。
  • video: 视频算法模块,包括目标识别追踪、运动估计等算法。
  • calib3d: 摄像机标定及三维重建,包括多种标定和配准算法、目标姿态估计等。
  • features2d: 二维特征检测模块,包括多种特征检测算子、多种特征匹配算法。
  • objdetect: 目标检测模块,检测定义的对象及实例,包括人脸、汽车、眼睛等。
  • dnn: 深度学习网络模块,包括搭建神经网络、加载网络、推理等。
  • ml: 机器学习模块,包括机器学习的分类、聚类算法。
  • flann: 快速近邻搜索算法。
  • photo: 照片处理算法,包括照片的降噪、修复、HDR成像等。
  • stitching: 图像拼接模块。
  • gapi: 定义OpenCV操作、使用它构建图形以及最终为特定后端实现和运行操作的方法。

二、图像基础知识

像素

“菜大”想通过现实中很具象的拼图去类比图像中的许多概念,如果你玩过我的世界,那么数字图像就更容易理解了。拼图是很多块小的拼图组成,同样数字图像是由像素组成,小的拼图块之于拼图与像素之于图像。购买拼图有一个很重要的参数是,小拼图块的块数,地狱级难度的拼图可以达到3000块!同样我们常听到图像1000x800,说明数字图像由800000个小的像素组成。

颜色模型

颜色空间是一个颜色的不同空间描述,颜色空间有很多,最常用的是RGB颜色空间。

  • RGB颜色空间。R,红色;G绿色;B,蓝色。
  • HSV/HSB颜色空间。H是色调,S是饱和度,V/B是亮度,
  • HSI/HSL颜色空间。H是色调,S是饱和度,L/I是亮度。
  • YUV/YCbCr颜色空间 亮度-色差来描述颜色的颜色空间。

二者在数学上都是圆柱,但HSV(色相、饱和度、明度)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心),HSL在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)

通道

拼图有二维拼图,也有三维立体,小的拼图块由一片小小的纸片变成了三维立体的积木。一般滴,灰度图片只有一个通道;彩色颜色模型都会有三个通道,如r,g,b三个、h,s,v三个通道。每个通道都是一幅图像,三个通道叠加之后就是我们看到的图像了。

三、图像处理

菜大说: 人类大脑可以快速处理各种信息,其中包括眼睛看到的情景。数字图像可以保存人类眼睛看到的场景,因此数字图像也承载着许多信息。图像处理本质上是处理信息,将有效信息提取出来,无效信息过滤消除掉。最常见的是图像分类,通过机器学习算法提取出有效特征,根据特征分类。雾天等恶劣天气下拍到的图像包含许多噪声,图像滤波算法将这些外界因素产生的噪声过滤掉。

OpenCV中的坐标系

OpenCV读取图片存入ndarray中,基于OpenCV建立的坐标系访问图片中元素,图片左上角为坐标原点。图像的像素为50x50,也就是说这个图像有2500个像素值。注意plt显示图像时,坐标系原点在左下角!

1. 读取图片(Read)

# 读取图片接口
cv.imread(filename[, flags]) -> retval

**flags形参:**以下列举了几个常用的参数,具体查看技术文档。

参数定义
cv.IMREAD_GRAYSCALE将图像转化为单通道灰度图像
cv.IMREAD_COLOR将图像转化为BGR格式图像
cv.IMREAD_ANYDEPTH若图像有相关深度则返回16位或32位图像,否则返回8位
cv.IMREAD_REDUCED_COLOR_8将图像转化为BGR三通道图像,且将图像缩小为1/8
# 读取灰度图片
print("-------读取灰度图片------")
gray_img = cv2.imread("checkerboard_s.png",0)
print(gray_img)

print("gray_img size is ", gray_img.shape)
print("Data type of gray_img is ", gray_img.dtype)

"""输出
-------读取灰度图片------
[[  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [255 255 255 255 255 255   0   0   0   0   0   0 255 255 255 255 255 255]
 [255 255 255 255 255 255   0   0   0   0   0   0 255 255 255 255 255 255]
 [255 255 255 255 255 255   0   0   0   0   0   0 255 255 255 255 255 255]
 [255 255 255 255 255 255   0   0   0   0   0   0 255 255 255 255 255 255]
 [255 255 255 255 255 255   0   0   0   0   0   0 255 255 255 255 255 255]
 [255 255 255 255 255 255   0   0   0   0   0   0 255 255 255 255 255 255]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]
 [  0   0   0   0   0   0 255 255 255 255 255 255   0   0   0   0   0   0]]
gray_img size is  (18, 18)
Data type of gray_img is  uint8
"""
print("-------读取彩色图片------")
color_img = cv2.imread("checkerboard_s.png")
print(color_img[0])
print("color_img size is ", color_img.shape)
print("Data type of color_img is ", color_img.dtype)
"""输出
-------读取彩色图片------
[[  0   0   0] [  0   0   0] [  0   0   0] [  0   0   0] [  0   0   0] [  0   0   0]
 [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255]
 [  0   0   0] [  0   0   0] [  0   0   0] [  0   0   0] [  0   0   0] [  0   0   0]]
color_img size is  (18, 18, 3)
Data type of color_img is  uint8
"""

2. 颜色通道分离与融合(Split&Merge)

分离融合的原因是:颜色通道中也包含有不同的信息,在RGB图像中的R、G、B对应了三个通道,也可以说是三个特征图,不同的图侧重点不一样,算法可以在不同的通道提取到有效的特征信息。有兴趣的可以看颜色通道的理解

# 分离颜色通道接口
cv.split(	m[, mv]	) ->	mv

# 融合颜色通道接口
cv.merge(	mv[, dst]	) ->	dst
# 分离rgb三个通道
img = cv2.imread("flowers.jpg",cv2.IMREAD_COLOR)

# opencv读的彩色图片类型为bgr
b,g,r = cv2.split(img)
print("size of img is: ", img.size)
print("size of b is: ", b.size)

# Colormap实例或注册的Colormap名称,用于将标量数据映射到颜色 默认绘制为RGB(A)颜色空间
plt.figure(figsize=[20,5])
plt.subplot(151);plt.imshow(img);plt.title("img");
plt.subplot(152);plt.imshow(r,cmap='gray');plt.title("Red Channel");
plt.subplot(153);plt.imshow(g,cmap='gray');plt.title("Green Channel");
plt.subplot(154);plt.imshow(b,cmap='gray');plt.title("Blue Channel");

# 融合三个通道的图片
imgMerged = cv2.merge((b, g, r))
plt.subplot(155);plt.imshow(imgMerged[:,:,::-1]);plt.title("Merged Output");

"""Output
size of img is:  7344000
size of b is:  2448000
"""

【问题】img原图显示为蓝色

OpenCV读取的图像颜色通道是BGR,plt显示图像是以RGB顺序显示的,所以就会导致图像颜色失真。

3. 颜色空间转换(Convert)

# 颜色空间转换图片接口
cv.cvtColor(	src, code[, dst[, dstCn]]	) ->	dst

# code参数指定图像转换方式,opencv中有很多转换方式详细查看文档~
code定义
cv.COLOR_BGR2BGRARGB或BGR图像增加alpha通道
cv.COLOR_RGB2RGBA
cv.COLOR_BGRA2BGR移除RGB或BGR图像的alpha通道
# BGR->RBG
image_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Colormap实例或注册的Colormap名称,用于将标量数据映射到颜色 默认绘制为RGB(A)颜色空间
plt.figure(figsize=[20,5])
plt.subplot(151);plt.imshow(image_rgb);plt.title("image_rgb");
plt.subplot(152);plt.imshow(r,cmap='gray');plt.title("Red Channel");
plt.subplot(153);plt.imshow(g,cmap='gray');plt.title("Green Channel");
plt.subplot(154);plt.imshow(b,cmap='gray');plt.title("Blue Channel");

# Merge the individual channels into a BGR image
imgMerged = cv2.merge((b, g, r))
plt.subplot(155);plt.imshow(imgMerged[:,:,::-1]);plt.title("Merged Output");

# BGR->HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Split the image into the B,G,R components
h,s,v = cv2.split(img_hsv)

# Show the channels
plt.figure(figsize=[20,5])
plt.subplot(141);plt.imshow(h,cmap='gray');plt.title("H Channel");
plt.subplot(142);plt.imshow(s,cmap='gray');plt.title("S Channel");
plt.subplot(143);plt.imshow(v,cmap='gray');plt.title("V Channel");
plt.subplot(144);plt.imshow(image_rgb);plt.title("Original");

4. 修改像素值(Modify)

h_new = h+10
img_NZ_merged = cv2.merge((h_new,s,v))
img_NZ_rgb = cv2.cvtColor(img_NZ_merged, cv2.COLOR_HSV2RGB)

# Show the channels
plt.figure(figsize=[20,5])
plt.subplot(141);plt.imshow(h,cmap='gray');plt.title("H Channel");
plt.subplot(142);plt.imshow(s,cmap='gray');plt.title("S Channel");
plt.subplot(143);plt.imshow(v,cmap='gray');plt.title("V Channel");
plt.subplot(144);plt.imshow(img_NZ_rgb);plt.title("Modified");

5. 剪切图片(Crop)

img_bgr = cv2.imread("flowers.jpg",cv2.IMREAD_COLOR)
img_rgb = img_bgr[:,:,::-1]
img_crop = cropped_region = img_rgb[40:500, 100:700]

plt.figure(figsize=[8,5])
plt.subplot(121);plt.imshow(img_rgb);plt.title("img_rgb");
plt.subplot(122);plt.imshow(img_crop);plt.title("img_crop");

6. 修改尺寸(Resize)

# 修改尺寸接口
cv.resize(	src, dsize[, dst[, fx[, fy[, interpolation]]]]	) ->	dst
"""
src--输入图片,dsize--输出尺寸,dst--输出结果
fx--水平缩放,fy--垂直缩放,interpolation--差值方式
resize(src, dst, Size(), 0.5, 0.5, interpolation);
"""
target_size = (800, 400)

resized_cropped_region = cv2.resize(img_crop, dsize=target_size, interpolation=cv2.INTER_AREA)
plt.figure(figsize=[10,5])
plt.subplot(121);plt.imshow(img_crop);plt.title("img_crop");
plt.subplot(122);plt.imshow(resized_cropped_region);plt.title("resized_cropped_region");

target_width = 2000
aspect_ratio = target_width / cropped_region.shape[1]
target_height = int(cropped_region.shape[0] * aspect_ratio)
target_size = (target_width, target_height)

# Resize image
resized_cropped_region_ratio = cv2.resize(cropped_region, dsize=target_size, interpolation=cv2.INTER_AREA)
plt.figure(figsize=[20,5])
plt.subplot(131);plt.imshow(img_crop);plt.title("img_crop");
plt.subplot(132);plt.imshow(resized_cropped_region);plt.title("resized_cropped_region");
plt.subplot(133);plt.imshow(resized_cropped_region_ratio);plt.title("resized_cropped_region_ratio");

7. 翻转(Flip)

# 翻转图片接口
cv.flip(	src, flipCode[, dst]	) ->	dst
# 0---x轴翻转 1---y周翻转, -1---x轴+y轴翻转
utterfly_bgr = cv2.imread("butterfly.jpg")
butterfly_rgb = butterfly_bgr[:,:,::-1]

butterfly_horz = cv2.flip(butterfly_rgb, 1)
butterfly_vert = cv2.flip(butterfly_rgb, 0)
butterfly_both = cv2.flip(butterfly_rgb, -1)

# Show the images
plt.figure(figsize=[18,5])
plt.subplot(141);plt.imshow(butterfly_horz);plt.title("Horizontal Flip");
plt.subplot(142);plt.imshow(butterfly_vert);plt.title("Vertical Flip");
plt.subplot(143);plt.imshow(butterfly_both);plt.title("Both Flipped");
plt.subplot(144);plt.imshow(butterfly_rgb);plt.title("butterfly_rgb");

参考资料:

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

opencv free course

Pencil-and-Cartoon-Effects

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个广泛使用的计算机视觉库,用于图像和视频处理。下面是一些OpenCV图像处理基础知识: 1. 图像加载和显示:使用OpenCV可以加载和显示图像。可以使用`cv2.imread()`函数加载图像,并使用`cv2.imshow()`函数显示图像。 2. 图像保存:使用`cv2.imwrite()`函数可以将图像保存到文件中。 3. 图像通道:彩色图像由三个颜色通道(红色、绿色和蓝色)组成,每个通道都是一个灰度图像。可以使用`cv2.split()`函数将彩色图像拆分成单个通道,并使用`cv2.merge()`函数将单个通道合并成彩色图像。 4. 图像缩放:可以使用`cv2.resize()`函数调整图像的大小。可以指定新的宽度和高度,或者指定缩放因子。 5. 图像旋转:可以使用`cv2.getRotationMatrix2D()`函数获得旋转矩阵,并使用`cv2.warpAffine()`函数对图像进行旋转。 6. 图像平滑:可以使用不同的滤波器对图像进行平滑处理,如均值滤波器、高斯滤波器等。可以使用`cv2.blur()`函数进行均值滤波,使用`cv2.GaussianBlur()`函数进行高斯滤波。 7. 图像边缘检测:可以使用不同的边缘检测算法,如Sobel算子、Canny边缘检测等。可以使用`cv2.Sobel()`函数进行Sobel算子边缘检测,使用`cv2.Canny()`函数进行Canny边缘检测。 8. 图像阈值处理:可以使用不同的阈值处理方法对图像进行二值化处理,如全局阈值、自适应阈值等。可以使用`cv2.threshold()`函数进行全局阈值处理,使用`cv2.adaptiveThreshold()`函数进行自适应阈值处理。 以上是OpenCV图像处理的一些基础知识,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值