图像处理
一、图像读入、显示和保存
1.读入图像
retval = cv2.imread(文件名[, 显示控制参数])
显示控制参数参数如下:
cv2.IMREAD_UNCHANGED
cv2.IMREAD_GRAYSCALE
cv2.IMREAD_COLOR
……
2.显示图像
None = cv2.imshow(窗口名, 图像名)
例如:
cv2.imshpw("demo", image)
等待命令:
retval = cv2.waitKey([, delay])
delay:
delay>0 等待delay毫秒
delay<0 等待键盘单击
delay=0 无限等待
删除所有窗口:
cv2.destroyAllWindows()
3.保存图像
cv2.imwrite(文件地址, 文件名)
二、图像处理入门基础
opencv中,彩色图像的通道顺序和通常的图像描述不同,使用的顺序是:B、G、R。
图像转换:
彩色图像转换成灰度图像;
灰度图像转换为二值图像等。
三、像素处理
1.读取像素
返回值 = 图像(位置参数)
对于灰度图:
p = img[10, 100]
对于RGB图像:
blue = img[10, 100, 0], green = img[10, 100, 1], red = img[10, 100, 2]
2.修改像素值
像素 = 新值
例如:
对于灰度图像:
img[10, 100] = 255
对于RGB图像:
img[10, 100] = [255, 255, 255]
四、numpy访问像素
1.读取像素
返回值 = 图像.item(位置参数)
对于灰度图像:
p = img.item(10, 100)
对于RGB图像:
blue = img.item(10, 100, 0), green = img.item(10, 100, 1), red = img.item(10, 100, 2) 或者 三通道数组 p = img.item(10, 100)
2.修改像素值
图像名.itemset(位置, 新值)
对于灰度图像:
p = img.itemset((10, 100), 255)
对于RGB图像:
img.itemset((10, 100, 0), 255), img.itemset((10, 100, 10), 255), img.itemset((10, 100, 2), 255)
五、获取图像属性
1.形状:行、列、通道;
shape可以获取图像的形状,返回包含行数、列数、通道数的元组。
例如:
import cv2
img1 = cv2.imread('灰度图像文件名')
print(img1.shape)
# (512, 512)
或者:
import cv2
img2 = cv2.imread('彩色图像文件名')
print(img2.shape)
# (512, 512, 3)
2.像素数目;
size可以获取图像的像素数目。
灰度图像 返回:行数×列数
彩色图像 返回:行数×列数×通道数
例如:
import cv2
img = cv2.imread('图像文件名')
print(img.size)
# 786432
3.图像的数据类型;
dtype返回的数图像的数据类型
例如:
import cv2
img = cv2.imread('图像文件名')
print(img.dtype)
# uint8
六、图像ROI
图像感兴趣区域。
import cv2
img = cv2.imread('图像名')
face = img[200:400, 200:400]
七、通道拆分和合并
1.拆分通道
import cv2
img = cv2.imread('图像名')
b, g, r = cv2.split(img)
2.合并通道
import cv2
img = cv2.imread('图像名')
b, g, r = cv2.split(img)
m = cv2.merge([b, g, r])
八、图像加法
1.numpy加法
取模加法
结果=图像1+图像2
若:
图像1+图像2<=255,结果=图像1+图像2;
图像1+图像2>255,结果=(图像1+图像2)%255;
2.opencv加法
饱和运算
结果=cv2.add(图像1, 图像2)
若:
图像1+图像2<=255,结果=图像1+图像2;
图像1+图像2>255,结果=255;
九、图像融合
将2张或者2张以上的图像信息融合到1张图像上
函数addWeighted
例如:
dst = cv2.addWeighted(src1, alpha, src2, bata, gamma)
dst = src1 * alpha + src2 * beta +gamma
注、亮度调节值gamma不能省略
十、类型转换
将图像由一种类型转换为另一种类型。
opencv提供了200多种不同类型之间的转换。
常用的如下:
cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2RGB
cv2.COLOR_GRAY2BGR
例如:
import cv2
a = cv2.imread('图像名')
b = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
十一、图像缩放
函数resize
dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
其中,dsize和fx, fy设置一个即可。
例如:
b = cv2.resize(a, (122, 122)) 元祖中第一个为列,第二个为行。
b = cv2.resize(a, None, fx=0.5, fy=0.7)
十二、图像翻转
函数flip
dst = cv2.flip(src, flipCode)
其中,flipCode:
flipCode=0,以X轴为对称轴翻转;
flipCode>0,以Y轴为对称轴翻转;
flipCode<0,以X轴、Y轴方向同时翻转。
例如;
dst = cv2.flip(src, 1)
十三、基础理论——图像阈值1
阈值分割
如下图所示:
二进制阈值化(Threshold Binary):先设定一个阈值,大于阈值的的像素点的灰度值设定为最大值(8位灰度值为255),灰度值小于阈值的像素点的灰度值设定为最小值。
反二进制阈值化(Threshold Binary,Inverted):先设定一个阈值,大于阈值的的像素点的灰度值设定为最小值0,灰度值小于阈值的像素点的灰度值设定为最大值。
截断阈值化(Truncate):先设定一个阈值,大于阈值的的像素点的灰度值设定该阈值,灰度值小于阈值的像素点的灰度值保持不变。
反阈值化为0(Threshold to Zero,Inverted):先设定一个阈值,大于阈值的的像素点的灰度值设定为0,灰度值小于阈值的像素点的灰度值保持不变。
阈值化为0(Threshold to Zero):先设定一个阈值,大于阈值的的像素点的灰度值保持不变,灰度值小于阈值的像素点的设置为0。
十四、基础理论——图像阈值1
Threshold函数及其实现
retval, dst = cv2.threshod(src, thresh, maxval, type)
retval:阈值
dst:处理结果
src:源图像
threshold:阈值
maxval:最大值
type:类型
其中,type可以有:
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO_INV
cv2.THRESH_TOZERO
十五、图像平滑——均值滤波
均值滤波如图所示:
函数blur
处理结果=cv2.blur(原始图像,核大小)
例如:
src = cv2.imread(r"C:\Users\Administrator\Desktop\shoe.jpg", cv2.IMREAD_GRAYSCALE)
dst = cv2.blur(src, ksize=(3, 3))
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey(-1)
十六、图像平滑——方框滤波
函数:boxFilter
处理结果=cv2.boxFilter(原始图像,目标图像深度,核大小,normalize属性)
目标图像深度:int类型的目标图像深度。通常使用-1,表示与原始图像一致。
normalize属性:是否对目标图像进行归一化处理。
其中,
即:
当normalize=true时:
与均值滤波相同。
当normalize=false时:
很容易发生溢出。
十七、图像平滑——高斯滤波
原理:
对于二维图像而言,需要用到二维的高斯函数(中心为原点),其形式如下:
假定中心点的坐标是(0,0),那么距离它最近的8个点的坐标如下:
假定σ=1.5,则模糊半径为1的权重矩阵如下:
这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵:
中心点以及周边n个点,每个点乘以自己的权重值并将这些值相加,就是中心点的高斯模糊的值。对所有点重复这个过程,就得到了高斯模糊后的图像。
如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。
对于边界点来说,周边没有足够的点,一个变通方法是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。
函数:GaussianBlur
dst = cv2.GaussianBlur(src, ksize, sigmaX)
ksize:核大小(N,N)必须是奇数
sigmaX:X方向方差,控制权重