首页 飞桨领航团 帖子详情
课堂杂谈--AI养成营学习笔记
收藏
快速回复
飞桨领航团 文章AI达人创造营 517 0
课堂杂谈--AI养成营学习笔记
收藏
快速回复
飞桨领航团 文章AI达人创造营 517 0

图像处理的概念与基本操作
图像:由RGB 像素组成图像的基本要素
常见的图片格式有:jpg、png、gif、psd、tiff、bmp等
不同格式所表示的内容相同,总体上说都是利用像素的变化和区别来表达和传递信息。

像素
分辨率
JPG与PNG格式的区别
JPG和PNG都是生活中较为常见和使用的两种图像,但是二者实际上是有区别的。
JPG所包含的信息第RGB三通道,而PNG格式的通道是RGBA四通道的;
而A(alpha)通道所表示的为图像的透明图。
因此,PNG格式的图片可以保存透明边缘的图片。

图像处理常用的库函数
对于图像处理经常使用的库函数有如: OpenCV、PIL

使用OpenCV加载并保存图片
OpenCV的是一个非常经典的图像处理库,中间封装了很多常见的图像处理函数,用于读取图像并做出识别

最基本的图像处理的命令:加载图片,显示图片,保存图片
对应到 OpenCV函数: cv2.imread(), cv2.imshow(), cv2.imwrite()

显示图片形状:
cv.shape 函数
可以显示图像的大小 如:(350, 350, 3)
注意:第一个是指列数,第二个是指行数,第三个是指通道数

灰度图的读取与显示
在显示灰度图时,要记得在函数中加入 :‘gray’
否则图像会默认为RGB图像,从而按照“GBR”读取成奇奇怪怪的颜色(如下图所示)

 

四通道图片的读取与显示
同样的问题在四通道的PNG图片上也应该得到注意,因为四通道在转义时alpha通道会自动丢失,入伙此时还用传统方法读取,就有问题了。

 


OpenCV库进阶操作
ROI:Region of Interest,感兴趣区域
可以理解为图像的截取,即从图像上选择感兴趣的区域

# 截取猫脸ROI
face = img[0:740, 400:1000]
plt.imshow(face)

提取时直接按照像素的坐标提取希望获得的像素区间即可

通道的分割与合并
彩色图的BGR三个通道是可以分开单独访问的,也可以将单独的三个通道合并成一副图像。分别使用cv2.split()和cv2.merge():

# 创建一副图片
img = cv2.imread('lena.jpg')
# 通道分割
b, g, r = cv2.split(img)
# 通道合并
img = cv2.merge((b, g, r))

颜色空间转换
颜色空间转换事实上可以理解成图像RGB通道值的调整
即通过对于RGB通道值的调整来调整图片的颜色空间(如色调等)

最常用的颜色空间转换如下:

RGB或BGR到灰度(COLOR_RGB2GRAY,COLOR_BGR2GRAY)
RGB或BGR到YcrCb(或YCC)(COLOR_RGB2YCrCb,COLOR_BGR2YCrCb)
RGB或BGR到HSV(COLOR_RGB2HSV,COLOR_BGR2HSV)
RGB或BGR到Luv(COLOR_RGB2Luv,COLOR_BGR2Luv)
灰度到RGB或BGR(COLOR_GRAY2RGB,COLOR_GRAY2BGR)

需要对图像进行转化时,调用上述函数即可,如:

img = cv2.imread('lena.jpg')
# 转换为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 保存灰度图
cv2.imwrite('img_gray.jpg', img_gray)
import numpy as np

import matplotlib.pyplot as plt

from PIL import Image,ImageEnhance

path = "baidu_bear.png" # 图片路径

image = Image.open(path) #读取图片

image_raw = image

image = np.array(image)

image_h = np.array(Image.open(path).convert('L'))

#在下面补充相关代码

img1 = ~image

mg1 = Image.fromarray(img1)

img2 = 255-image_h

img2 = Image.fromarray(img2.astype('uint8'))

img3 = ~(255-image_h)

img3 = Image.fromarray(img3.astype('uint8'))

color_enhancer = ImageEnhance.Color(image_raw)

img4 = color_enhancer.enhance(1.5)

newname1 = "./4-1.png"

newname2 = "./4-2.png"

newname3 = "./4-3.png"

newname4 = "./4-4.png"

img1.save(newname1)

img2.save(newname2)

img3.save(newname3)

mg4.save(newname4)

此作业是将小熊进行图像色调的处理,我感觉这个是作业里面蛮烦的一个
特定颜色物体追踪
最早期的图像处理概念:通过一些函数,对于特定频道范围内的RGB数值进行一些调整和处理,从而让图像更符合人类需求的操作。

如:除了RGB图像表示方法外,还有很多图像的表示方法,如RGB、HSV和HSL等,可以从下面连接中获取详细知识:

RGB、HSV和HSL颜色空间

HSV:色调、饱和度、明度
色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]
HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用COLOR_BGR2HSV表示。阈值分割
使用固定阈值、自适应阈值和Otsu阈值法"二值化"图像
OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()

固定阈值分割
固定阈值分割很直接,一句话说就是像素点值大于阈值变成一类值,小于阈值变成另一类值。

cv2.threshold()用来实现阈值分割,ret是return value缩写,代表当前的阈值。函数有4个参数:

参数1:要处理的原图,一般是灰度图
参数2:设定的阈值
参数3:最大阈值,一般为255
参数4:阈值的方式,主要有5种,详情:ThresholdTypes
0: THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4:THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变

 

自适应阈值
看得出来固定阈值是在整幅图片上应用一个阈值进行分割,它并不适用于明暗分布不均的图片。 cv2.adaptiveThreshold()自适应阈值会每次取图片的一小部分计算阈值,这样图片不同区域的阈值就不尽相同。它有5个参数,其实很好理解,先看下效果:

参数1:要处理的原图
参数2:最大阈值,一般为255
参数3:小区域阈值的计算方式
ADAPTIVE_THRESH_MEAN_C:小区域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
参数4:阈值方式(跟前面讲的那5种相同)
参数5:小区域的面积,如11就是11*11的小块
参数6:最终阈值等于小区域计算出的阈值再减去此值

Otsu阈值
在前面固定阈值中,我们是随便选了一个阈值如127,那如何知道我们选的这个阈值效果好不好呢?答案是:不断尝试,所以这种方法在很多文献中都被称为经验阈值。Otsu阈值法就提供了一种自动高效的二值化方法。

图像几何变换
图像常见的几何变换形式:旋转、平移和缩放图片
对应OpenCV函数:cv2.resize(), cv2.flip(), cv2.warpAffine()

缩放图片
缩放就是调整图片的大小,使用cv2.resize()函数实现缩放。可以按照比例缩放,也可以按照指定的大小缩放: 我们也可以指定缩放方法interpolation,更专业点叫插值方法,默认是INTER_LINEAR,全部可以参考:InterpolationFlags

缩放过程中有五种插值方式:

cv2.INTER_NEAREST 最近邻插值
cv2.INTER_LINEAR 线性插值
cv2.INTER_AREA 基于局部像素的重采样,区域插值
cv2.INTER_CUBIC 基于邻域4x4像素的三次插值
cv2.INTER_LANCZOS4 基于8x8像素邻域的Lanczos插值

翻转图片
镜像翻转图片,可以用cv2.flip()函数: 其中,参数2 = 0:垂直翻转(沿x轴),参数2 > 0: 水平翻转(沿y轴),参数2 < 0: 水平垂直翻转。

完成作业样例

import numpy as np

import matplotlib.pyplot as plt

from PIL import Image

path = "baidu_bear.png" # 图片路径

image = Image.open(path)

#image = np.array(image) #在下面补充相关代码

img1 = image.transpose(Image.FLIP_LEFT_RIGHT)

img2 = image.transpose(Image.FLIP_TOP_BOTTOM)

newname1 = "./1-1.png"

newname2 = "./1-2.png"

img1.save(newname1)

mg2.save(newname2)

将作业中的小熊翻转,感觉弄起来稍微有点麻烦,因为基础不太好

平移图片
要平移图片,我们需要定义下面这样一个矩阵,tx,ty是向x和y方向平移的距离:


平移是用仿射变换函数cv2.warpAffine()实现的

绘图功能
绘制各种几何形状、添加文字
OpenCV函数:cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()
绘制形状的函数有一些共同的参数,提前在此说明一下:

img: 要绘制形状的图片
color: 绘制的颜色
彩色图就传入BGR的一组值,如蓝色就是(255,0,0)
灰度图,传入一个灰度值就行
thickness: 线宽,默认为1;对于矩形/圆之类的封闭形状而言,传入-1表示填充形状
lineType: 线的类型。默认情况下,它是8连接的。cv2.LINE_AA 是适合曲线的抗锯齿线。

图像间数学运算
图片间的数学运算,如相加、按位运算等
OpenCV函数:cv2.add(), cv2.addWeighted(), cv2.bitwise_and()

平滑图像
模糊/平滑图片来消除图片噪声
OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter()

关于滤波和模糊:

它们都属于卷积,不同滤波方法之间只是卷积核不同(对线性滤波而言)
低通滤波器是模糊,高通滤波器是锐化
低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

常见噪声有椒盐噪声和高斯噪声,椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声。

边缘检测
Canny边缘检测的简单概念
OpenCV函数:cv2.Canny()
Canny边缘检测方法常被誉为边缘检测的最优方法:

cv2.Canny() 进行边缘检测,参数2、3表示最低、高阈值,下面来解释下具体原理。

之前我们用低通滤波的方式模糊了图片,那反过来,想得到物体的边缘,就需要用到高通滤波。

腐蚀与膨胀
了解形态学操作的概念
学习膨胀、腐蚀、开运算和闭运算等形态学操作
OpenCV函数:cv2.erode(), cv2.dilate(), cv2.morphologyEx()

形态学操作其实就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖"。

形态学操作一般作用于二值化图,来连接相邻的元素或分离成独立的元素。腐蚀和膨胀是针对图片中的白色部分!



0
收藏
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户