图像处理

一、图像读入、显示和保存

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:UsersAdministratorDesktopshoe.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方向方差,控制权重

原文地址:https://www.cnblogs.com/xjlearningAI/p/12899469.html