opencv-python笔记(1)

1|0openCV笔记

1|1图像

1|0灰度图像

​ 0代表纯黑色,255代表白色(类似亮度)

1|0通道拆分

1|0通过索引拆分:
import cv2 lena=cv2.imread("lenacolor.png") cv2.imshow("lena1",lena) b=lena[:,:,0] g=lena[:,:,1] r=lena[:,:,2] cv2.imshow("b",b) cv2.imshow("g",g) cv2.imshow("r",r) lena[:,:,0]=0 cv2.imshow("lenab0",lena) lena[:,:,1]=0 cv2.imshow("lenab0g0",lena) cv2.waitKey() cv2.destroyAllWindows()
1|0通过cv2.split()函数拆分:
import cv2 lena=cv2.imread("lenacolor.png") b,g,r=cv2.split(lena) cv2.imshow("B",b) cv2.imshow("G",g) cv2.imshow("R",r) cv2.waitKey() cv2.destroyAllWindows()

1|0图像属性

1|0获取图像属性

shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或 者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一 幅图像是灰度图像(或二值图像)还是彩色图像。

size:返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道 数为 1。

dtype:返回图像的数据类型。

如:

import cv2 gray=cv2.imread("lena.bmp",0) color=cv2.imread("lenacolor.png") print("图像 gray 属性:") print("gray.shape=",gray.shape) print("gray.size=",gray.size) print("gray.dtype=",gray.dtype) print("图像 color 属性:") print("color.shape=",color.shape) print("color.size=",color.size) print("color.dtype=",color.dtype)
1|0重置图像属性
import cv2 as cv # 读入原图片 img = cv.imread('test.jpg') # 打印出图片尺寸 print(img.shape) # 将图片高和宽分别赋值给x,y x, y = img.shape[0:2] # 显示原图 cv.imshow('OriginalPicture', img) # 缩放到原来的二分之一,输出尺寸格式为(宽,高) img_test1 = cv.resize(img, (int(y / 2), int(x / 2))) cv.imshow('resize0', img_test1) cv.waitKey() # 最近邻插值法缩放 # 缩放到原来的四分之一 img_test2 = cv.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv.INTER_NEAREST) cv.imshow('resize1', img_test2) cv.waitKey() cv.destroyAllWindows()

1|2图像运算

1|0图像相加

直接加法运算:a+b=mod(a+b,256)

使用cv2.add:大于255则饱和

1|0图像加权:使用cv2.addWeighted函数

​ dst=cv2.addWeighted(src1, alpha, src2, beta, gamma),其中gamma为亮度调节

1|0图像位运算

1|0按位与

​ dst = cv2.bitwise_and( src1, src2[, mask]] )

· 其中mask表示可选操作掩码,即指定要更改的输出数组的元素,也即输出图像像素只有mask对应位置元素不为0的部分才输出,否则 该位置像素的所有通道分量都设置为0

1|0按位或

​ dst = cv2.bitwise_or( src1, src2[, mask]] )

1|0按位非

​ dst = cv2.bitwise_not( src[, mask]] )

1|0按位异或(与二进制加法类似)

​ dst = cv2.bitwise_xor( src1, src2[, mask]] )

1|0位平面分解

1|0提取某个位平面:
import cv2 import numpy as np i = 5 #提取第五位平面 rose = cv2.imread("Rose.jpg",0) x = np.ones(rose.shape, dtype=np.uint8)*(2**i) result = cv2.bitwise_and(rose, x) cv2.imshow("img",result) cv2.waitKey(0)
1|0提取位平面并进行阈值处理:
import cv2 import numpy as np img = cv2.imread("1.jpg", 0) cv2.imshow("rose",img) r, c = img.shape x = np.zeros((r, c, 8), dtype=np.uint8) #提取矩阵 for i in range(8): x[:, :, i] = 2 ** i r = np.zeros((r, c, 8), dtype=np.uint8) #存放8个位平面 for i in range(8): r[:, :, i] = cv2.bitwise_and(img, x[:, :, i]) #提取位平面 img2 = cv2.bitwise_xor(r[:,:,6],r[:,:,7]) mask = r[:, :, i] > 0 #阈值处理 r[mask] = 255 mask = img2[:,:]>0 img2[mask] = 255 cv2.imshow("img",img2) cv2.imshow("img0",r[:,:,7]) cv2.waitKey()

1|3色彩空间

1|0色彩空间基础

1|0GRAY色彩空间

GRAY(灰度图像)通常指 8 位灰度图,其具有 256 个灰度级,像素值的范围是[0,255]。 当图像由 RGB 色彩空间转换为 GRAY 色彩空间时,其处理方式如下:

Gray = 0.299 · 𝑅 + 0.587 · 𝐺 + 0.114 · 𝐵

上述是标准的转换方式,也是 OpenCV 中使用的转换方式。有时,也可以采用简化形式完 成转换:

Gray = (𝑅 + 𝐺 + 𝐵 ) / 3

当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的,其处理方式如下:

𝑅 = Gray

𝐺 = Gray

𝐵 = Gray

1|0HSV色彩空间

分为色调,饱和度,亮度

色调环:

​ 0 红色

​ 60 黄色

​ 120 绿色

​ 180 青色

​ 240 蓝色

​ 300 品红色

在openCV中需要将色调值除以2来适应uint8存储类型

1|0色彩空间的转换

调用cv2.cvtColor()函数

dst = cv2.cvtColor( src, code [, dstCn] )

式中:

· dst 表示输出图像,与原始输入图像具有同样的数据类型和深度。

· src 表示原始输入图像。可以是 8 位无符号图像、16 位无符号图像,或者单精度浮点数等。

· code 是色彩空间转换码,表 4-2 展示了其枚举值。

· dstCn 是目标图像的通道数。如果参数为默认的 0,则通道数自动通过原始输入图像和 code 得到

1|0HSV色彩空间及其应用

H:色调,Hue

S:饱和度,Saturation

V:亮度,Value

1|0色调

openCV中,色调值如下:

0 红色

30 黄色

60 绿色

90 青色

120 蓝色

150 品红色

1|0饱和度:

​ 原值为[0,1],映射到openCV中为[0,255]

​ 灰度颜色R,G,B是相等的,故饱和度值为0

​ 若颜色饱和度很低,那么其计算得出的色调值就不可靠

1|0亮度

​ 同样的,[0,1] —> [0,255]

1|0标记指定颜色

颜色的差异主要体现在 H 通道值的不同上。所以,通过对 H 通道值进行筛选,便能够筛选出 特定的颜色。

我们可以通过cv2.inRange()函数来锁定特征值:

dst = cv2.inRange( src, lowerb, upperb )

其中:

· dst 表示输出结果,大小和 src 一致。

· src 表示要检查的数组或图像。

· lowerb 表示范围下界。

· upperb 表示范围上界。

· 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。

· 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。(即作为掩图)

1|0通过基于掩码的按位与显示ROI
import cv2 import numpy as np img = cv2.imread("Rose.jpg") img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 转成HSV格式 minRed = np.array([-10, 100, 100]) maxRed = np.array([10, 255, 255]) # 设置颜色范围 mask = cv2.inRange(img_hsv, minRed, maxRed) # 获得掩码 Red = cv2.bitwise_and(img, img, mask= mask) # 锁定红色区域 cv2.imshow("red",Red) cv2.waitKey(0)
1|0通道融合函数

cv2.merge(mv[, dst])

如:

import cv2 img=cv2.imread("barbara.bmp") hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h,s,v=cv2.split(hsv) v[:,:]=255 newHSV=cv2.merge([h,s,v]) art = cv2.cvtColor(newHSV, cv2.COLOR_HSV2BGR) cv2.imshow("img",img) cv2.imshow("art",art) cv2.waitKey() cv2.destroyAllWindows()
1|0alpha通道

alpha通道一般代表透明度的值,取值为[0,255],表示从透明到不透明。

加入alpha通道的图像格式为BGRA。

例程:

import cv2 import numpy as np img = cv2.imread("Rose.jpg") img_bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA) # 转成BGRA格式 b,g,r,a = cv2.split(img_bgra) a[:,:] = 0 new = cv2.merge([b,g,r,a]) cv2.imshow("red",new) cv2.waitKey(0)

1|4几何变换

1|0缩放

dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )

其中:

  • dst 代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时), 或者可以通过 src.size()、fx、fy 计算得到。
  • src 代表需要缩放的原始图像。
  • dsize 代表输出图像大小。
  • fx 代表水平方向的缩放比例。
  • fy 代表垂直方向的缩放比例。
  • interpolation 代表插值方式。(默认双线性插值)

例程:

import cv2 import numpy as np img=np.ones([2,4,3],dtype=np.uint8) size=img.shape[:2] rst=cv2.resize(img,size) print("img.shape=\n",img.shape) print("img=\n",img) print("rst.shape=\n",rst.shape) print("rst=\n",rst)

1|0翻转

函数:dst = cv2.flip( src, flipCode )

其中:

  • dst 代表和原始图像具有同样大小、类型的目标图像。
  • src 代表要处理的原始图像。
  • flipCode 代表旋转类型,如下:

0代表绕着x轴翻转

正数代表绕y轴翻转(镜像)

负数代表绕x,y同时翻转(旋转180°)

1|0仿射,透视

感觉用不太到,没看

1|0重映射

表示把一幅图像内的像素点放置到另外一幅图像内的指定位置。

函数:dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]]

其中:

  • dst 代表目标图像,它和 src 具有相同的大小和类型。

  • src 代表原始图像。

  • map1 参数有两种可能的值:

    • 表示(x,y)点的一个映射。
    • 表示 CV_16SC2 , CV_32FC1, CV_32FC2 类型(x,y)点的 x值。
  • map2 参数同样有两种可能的值:

    • 当 map1 表示(x,y)时,该值为空。
    • 当 map1 表示(x,y)点的 x 值时,该值是 CV_16UC1, CV_32FC1 类型(x,y)点的 y 值。
  • Interpolation 代表插值方式,这里不支持 INTER_AREA 方法。

  • borderMode 代表边界模式。当该值为 BORDER_TRANSPARENT 时,表示目标图像内 的对应源图像内奇异点(outliers)的像素不会被修改。

  • borderValue 代表边界值,该值默认为 0。

不细嗦了。

1|5阈值处理

直白的说,就是将大于某个值设为255,低的就设为0。

函数:

cv2.threshold()

cv2.adaptiveThreshold()

1|0threshold函数

retval, dst = cv2.threshold( src, thresh, maxval, type )

式中:

  • retval 代表返回的阈值。
  • dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
  • src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
  • thresh 代表要设定的阈值。
  • maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值。
  • type 代表阈值分割的类型

1|0cv2.THRESH_BINARY

大于thresh,设置为最大值,小于则为0

例:

import cv2 import numpy as np img = cv2.imread("Alice1.jpg",0) x,y = img.shape[0:2] t,img_bina = cv2.threshold(img,120,255,cv2.THRESH_BINARY) new = cv2.resize(img_bina,(int(1/3*x),int(1/2*y))) cv2.imshow("new",new) cv2.waitKey(0)

1|0cv2.THRESH_BINARY_INV

没啥,就反相。

其他的就不细嗦了

1|0自适应阈值处理

dst = cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )

式中:

  • dst 代表自适应阈值处理结果。
  • src 代表要进行处理的原始图像。需要注意的是,该图像必须是 8 位单通道的图像。
  • maxValue 代表最大值。
  • adaptiveMethod 代表自适应方法。
  • thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV 中的一个。
  • blockSize 代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为 3、5、 7 等。
  • C 是常量。

其中自适应方法:

  • cv2.ADAPTIVE_THRESH_MEAN_C:领域内所有像素点权值一样
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通 过高斯方程得到各个点的权重值

例:

import cv2 import numpy as np img = cv2.imread("Alice1.jpg",0) x,y = img.shape[0:2] img_bina = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,17,3) new = cv2.resize(img_bina,(int(1/3*x),int(1/2*y))) #缩放,更方便观察效果 cv2.imshow("new",new) cv2.waitKey(0)

1|0Otsu处理

简单来说,就是让opencv帮你算thresh。

食用方法:

t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

注意:

  • 设置的thresh要为0
  • 后面加上cv2.THRESH_OTSU方案

1|6图像平滑处理

图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。

取近似值的主要方式:

  • 均值滤波
  • 方波滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波
  • 2D卷积

1|0均值滤波

用周围n*n的区域内均值代表该处像素值

针对边缘点,取边角处。

卷积核:

K=1MN[1 1 1 ... 1 11 1 1 ... 1 1.. .. .. .. .1 1 1 ... 1 1]

式中,M 和 N 分别对应高度和宽度。一般情况下,M 和 N 是相等的,例如比较常用的 3×3、5×5、 7×7 等。如果 M 和 N 的值越大,参与运算的像素点数量就越多,图像失真越严重。

把卷积核的元素与待处理区域计算即可获得最终值

1|0编程实现

函数语法:

dst = cv2.blur( src, ksize, anchor, borderType )

  • ksize 是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。 例如,其值可以为(5, 5),表示以 5×5 大小的邻域均值作为图像均值滤波处理的结果,。
  • anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
  • borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下不需要考虑该值的取值,直接采用默认值即可。

其一般形式为:

dst = cv2.blur( src, ksize,)

例:

import cv2 import numpy as np img = cv2.imread("AliceNoise.jpg",0) img_blur = cv2.blur(img,(6,6)) x,y = img_blur.shape[:2] new = cv2.resize(img_blur,(int(1/3*x),int(1/2*y))) #缩放,更方便观察效果 cv2.imshow("new",new) cv2.waitKey(0)

1|0方框滤波

1|0基本原理

在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择 滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

1|0函数实现

函数语法:

dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )

其中:

  • ddepth 是处理结果图像的图像深度,一般使用-1 表示与原始图像使用相同的图像深度。
  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以 3×3 大小的邻域均值作为图像均值滤波处理的结果
  • anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
  • normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围 内的值)处理,该参数是一个逻辑值,可能为真(值为 1)或假(值为 0)。
    • 当参数 normalize=1 时,表示要进行归一化处理,要用邻域像素值的和除以面积。
    • 当参数 normalize=0 时,表示不需要进行归一化处理,直接使用邻域像素值的和。

常用形式:

dst = cv2.boxFilter( src, ddepth, ksize )

1|0高斯滤波

在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将 中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

1|0函数语法

dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

其中

  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,滤波核的值必须是奇数
  • sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。
  • sigmaY 是卷积核在垂直方向上(Y 轴方向)的标准差。如果将该值设置为 0,则只采用 sigmaX 的值;如果 sigmaX 和 sigmaY 都是 0,则通过 ksize.width 和 ksize.height 计算得到。
    • sigmaX = 0.3×[(ksize.width-1)×0.5 -1] + 0.8
    • sigmaY = 0.3×[(ksize.height-1)×0.5-1] + 0.8

例:

import cv2 import numpy as np img = cv2.imread("Alice1.jpg") # img_blur = cv2.blur(img,(6,6)) img_blur = cv2.GaussianBlur(img,(7,7),0,0) x,y = img_blur.shape[:2] new = cv2.resize(img_blur,(int(1/3.5*x),int(1/2*y))) #缩放,更方便观察效果 cv2.imshow("new",new) cv2.waitKey(0)

1|0中值滤波

中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻 域内所有像素值的中间值来替代当前像素点的像素值。

1|0函数实现

dst = cv2.medianBlur( src, ksize)

其中:

  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,核大小必须是比 1 大的奇数,比如 3、5、7 等。

在中值滤波处理中,噪声成分很难被选上,所以可以在几乎不影响原有图像的情 况下去除全部噪声。但是由于需要进行排序等操作,中值滤波需要的运算量较大

例:

import cv2 import numpy as np img = cv2.imread("AliceNoise.jpg") img_blur = cv2.medianBlur(img,3) img_blur = cv2.GaussianBlur(img_blur,(3,3),0,0) x,y = img_blur.shape[:2] new = cv2.resize(img_blur,(int(1/3.5*x),int(1/2*y))) #缩放,更方便观察效果 cv2.imwrite("Alice2.jpg",img_blur) cv2.imshow("new",new) cv2.waitKey(0)

1|0双边滤波

双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。

1|0算法思想

在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为 0,直接忽略该点),这样就保护了边缘信息。

1|0函数语法

dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType )

其中:

  • d 是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度 较慢。因此,在实时应用中,推荐 d=5。对于较大噪声的离线滤波,可以选择 d=9。
  • sigmaColor 是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的 滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为 0 时,滤波失去意义;该值为 255 时,指定直径内的所有点都能够参与运算。
  • sigmaSpace 是坐标空间中的 sigma 值。它的值越大,说明有越多的点能够参与到滤波计 算中来。当 d>0 时,无论 sigmaSpace 的值如何,d 都指定邻域大小;否则,d 与 sigmaSpace 的值成比例。
  • borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

1|02D卷积

说白了,自定义卷积核

dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType )

其中:

  • kernel 是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不 同的核,则必须将彩色图像分解后使用不同的核完成操作。
  • delta 是修正值,它是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果。

__EOF__

本文作者Asaka
本文链接https://www.cnblogs.com/Asaka-QianXiang/p/17216334.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Akasa  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示