Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OpenCV - 矩阵操作 Part 1

OpenCV - 矩阵操作 Part 1

作者头像
为为为什么
发布于 2022-08-09 06:12:35
发布于 2022-08-09 06:12:35
1.5K00
代码可运行
举报
文章被收录于专栏:又见苍岚又见苍岚
运行总次数:0
代码可运行

OpenCV 自带大量矩阵处理函数,本文记录相关内容。

简介

  • OpenCV 矩阵类的成员函数可以进行很多基本的矩阵操作,本文基于 《学习 OpenCV3 》中第五章的内容整理 Python OpenCV 矩阵操作函数。
内容列表

序号

函数

描述

1

cv2.absdiff()

计算两个矩阵差值的绝对值

2

cv2.add()

实现两个矩阵逐元素相加

3

cv2.addWeighted()

实现两个矩阵逐元素加权求和(以为混合值)

4

cv2.bitwise_and()

计算两个矩阵逐元素按位与

5

cv2.bitwise_not()

按位非

6

cv2.bitwise_or()

计算两个矩阵逐元素按位或

7

cv2.bitwise_xor()

计算两个矩阵逐元素按位异或

8

cv2.calcCovarMatrix()

计算一组n维向量的协方差

9

cv2.cartToPolar()

计算二维向量的角度和幅度

10

cv2.checkRange()

检查矩阵的无效值

11

cv2.compare()

对两个矩阵中的所有元素应用所选择的比较运算符

12

cv2.completeSymm()

通过将一半元素复制到另一半来使矩阵对称

13

cv2.convertScaleAbs()

缩放矩阵,取绝对值,然后转换为8位无符号数

14

cv2.countNonZero()

计算矩阵中非零元素个数

15

cv2.cvtColor()

转换图像颜色空间

16

cv2.dct()

计算矩阵的离散余弦变换

17

cv2.determinant()

计算方阵的行列式

18

cv2.dft()

计算矩阵的离散傅里叶变换

19

cv2.divide()

实现两个矩阵逐元素相除

20

cv2.eigen()

计算方阵的特征值和特征向量

矩阵操作

0. 基础引用
  • 之后对上述函数进行示例演示
  • 所有代码默认引用如下包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import numpy as np
import mtutils as mt
from mtutils import PIS
  • 示例图片 img1.jpgimg2.jpg
1. cv2.absdiff()

计算两个矩阵差值的绝对值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
matrix_a = np.random.random([5,5])
matrix_b = np.random.random([5,5])

res = cv2.absdiff(matrix_a, matrix_b)
2. cv2.add()

实现两个矩阵逐元素相加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
matrix_a = np.random.random([5,5])
matrix_b = np.random.random([5,5])

res = cv2.add(matrix_a, matrix_b)
3. cv2.addWeighted()

实现两个矩阵逐元素加权求和(以为混合值)

  • 函数使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
addWeighted(src1, alpha, src2, beta, gamma)

参数说明src1图像1alpha图像1 权重 (例如 0.5)src2图像2beta图像2 权重 (例如 0.5)gamma附加偏置

  • 函数实现功能 $dst = src1alpha + src2beta + gamma$
  • 使用示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_1 = mt.cv_rgb_imread('img1.jpg')
image_1 = mt.image_resize(image_1, [300, 300])
image_2 = mt.cv_rgb_imread('img2.jpg')
image_2 = mt.image_resize(image_2, [300, 300])

res1 = cv2.addWeighted(image_1, 0.8, image_2, 0.3, 5)
res2 = cv2.addWeighted(image_1, 0.5, image_2, 0.5, 5)
PIS(image_1, image_2, res1, res2)
4. cv2.bitwise_and()

对应像素按位与

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_1 = mt.cv_rgb_imread('img1.jpg')
image_2 = mt.cv_rgb_imread('img2.jpg')

image_1 = mt.image_resize(image_1, [300, 300])
image_2 = mt.image_resize(image_2, [300, 300])

res = cv2.bitwise_and(image_1, image_2)
PIS(res)
  • 相当于所有数据分别按位与后的结果
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(cv2.bitwise_and(image_1, image_2) == image_1 & image_2).all()

->
True
5. cv2.bitwise_not()

按位非

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_1 = mt.cv_rgb_imread('img1.jpg')
image_2 = mt.cv_rgb_imread('img2.jpg')

image_1 = mt.image_resize(image_1, [300, 300])
image_2 = mt.image_resize(image_2, [300, 300])

res = cv2.bitwise_not(image_1)
PIS(res)
6. cv2.bitwise_or()

计算两个矩阵逐元素按位或

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_1 = mt.cv_rgb_imread('img1.jpg')
image_2 = mt.cv_rgb_imread('img2.jpg')

image_1 = mt.image_resize(image_1, [300, 300])
image_2 = mt.image_resize(image_2, [300, 300])

res = cv2.bitwise_or(image_1, image_2)
PIS(res)
7. cv2.bitwise_xor()

计算两个矩阵逐元素按位异或

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_1 = mt.cv_rgb_imread('img1.jpg')
image_2 = mt.cv_rgb_imread('img2.jpg')

image_1 = mt.image_resize(image_1, [300, 300])
image_2 = mt.image_resize(image_2, [300, 300])

res = cv2.bitwise_xor(image_1, image_2)
PIS(res)
8. cv2.calcCovarMatrix()

给定一些向量,假设这些向量表示的点是近似高斯分布的,cv2.calcCovarMatrix() 将计 算这些点的均值和协方差矩阵。

  • 函数使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.calcCovarMatrix(samples, flags[, covar[, mean[, ctype]]]) → covar, mean

Flags

含义

CV_COVAR_SCRAMBLED

快速PCA“scrambled”协方差,转置位置不同的计算方式,与 CV_COVAR_NORMAL 互斥

CV_COVAR_NORMAL

计算均值和协方差,正常计算协方差,与 CV_COVAR_SCRAMBLED 互斥

CV_COVAR_USE_AVG

输入均值而不是计算均值(在均值已知情况下减少运算时间)

CV_COVAR_SCALE

重新缩放输出的协方差矩阵

CV_COVAR_ROWS

使用样本的行作为输入向量(如输入向量为 m * n 则需要指定)

CV_COVAR_COLS

使用样本的列作为输入向量(如输入向量为 m * n 则需要指定)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector = np.array([[1,2,3], [4,5,6], [7, 8, 9]]).astype('float32')
covar, mean = cv2.calcCovarMatrix(vector, None, flags=cv2.COVAR_NORMAL | cv2.COVAR_COLS )

-->
covar
array([[2., 2., 2.],
       [2., 2., 2.],
       [2., 2., 2.]])

mean
array([[2.],
       [5.],
       [8.]])
9. cv2.cartToPolar()

计算二维向量的角度和幅度,笛卡尔坐标转极坐标

  • 函数使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
magnitude, angle = cv2.cartToPolar(x, y)
  • 输入维度相同的 X, Y 向量 (float32 或 float64),返回相同维度的坐标转换结果
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector = np.array([[1,1,1],[1,1,1]]).astype('float32')
X =vector
Y = vector
mag, ang = cv2.cartToPolar(X, Y)

-->
mag
array([[1.4142135, 1.4142135, 1.4142135],
       [1.4142135, 1.4142135, 1.4142135]], dtype=float32)
ang
array([[0.7852316, 0.7852316, 0.7852316],
       [0.7852316, 0.7852316, 0.7852316]], dtype=float32)
10. cv2.checkRange()

函数 cv2.checkRange() 检查输入矩阵src的每个元素,并确定该元素是否在给定范围内。范围由minValmaxVal设置,但任何NaN或inf值也被认为超出范围。如果找到超出范围的值,除非将quiet设置为true,否则抛出异常。在这种情况下,如果所有值都在范 围内,返回值就为true;如果有任何值超出范围,返回值则为false。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_1 = mt.cv_rgb_imread('img1.jpg')
cv2.checkRange(image_1, False, 0, 255)
11. cv2.compare()

该函数在两个矩阵src1src2中的对应元素之间进行逐元素比较,并将结果放在图像dst中。cv2.compare() 将最后一个参数作为比较运算符。在每种情况下,结果dst的每个像素都是一个8位序列,匹配的像素被标记为255,不匹配的像素被设置为0。 通过 numpy 的矩阵运算也完全可以实现。

  • 函数使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.compare(src1, src2, cmpop)
  • cmpop 参数说明

cmp_op

比较操作

cv2.CMP_EQ

src1i == src2i

cv2.CMP_GT

src1i > src2i

cv2.CMP_GE

src1i >= src2i

cv2.CMP_LT

src1i < src2i

cv2.CMP_LE

src1i <= src2i

cv2.CMP_NE

src1i != src2i

  • 代码示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector_1 = np.random.random([5,5,5,5])
vector_2 = np.random.random([5,5,5,5])

res = cv2.compare(vector_1, vector_2, cmpop=cv2.CMP_GE)
    
-->
res
array([[[[  0,   0,   0, 255, 255],
         [  0,   0, 255, 255, 255],
         [  0, 255, 255, 255, 255],
         [255, 255,   0, 255,   0],
         [  0, 255,   0,   0, 255]],
         
         ...

res.shape
(5, 5, 5, 5)
12. cv2.completeSymm()

给定一个(二维)矩阵 mtx, cv2.completeSymm() 通过复制来使矩阵对称注1。具体来说,来自上三角形的所有元素都被复制到它们在矩阵下三角形对应的转置位置。tx的对角元素保持不变。如果标志 lowerToUpper 设置为true,则来自下三角形的元素将被复制到上三角形中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector_1 = np.random.random([5,5])
res = cv2.completeSymm(vector_1, lowerToUpper=False)

-->
res
array([[0.2604316 , 0.57123429, 0.24625302, 0.51625787, 0.53749169],
       [0.57123429, 0.2294393 , 0.17753148, 0.29501751, 0.34551   ],
       [0.24625302, 0.17753148, 0.08954819, 0.3061089 , 0.57356678],
       [0.51625787, 0.29501751, 0.3061089 , 0.54457652, 0.61120996],
       [0.53749169, 0.34551   , 0.57356678, 0.61120996, 0.03919279]])
13. cv2.convertScaleAbs()

缩放矩阵,取绝对值,然后转换为8位无符号数 函数cv2.convertScaleAbs() 实际上融多种功能于一体。它将按顺序执行四个操作。第一个操作是通过因子alpha来重新调整源图像,第二个操作是通过(加)因子beta来偏移,第三个操作是计算上述所求和的绝对值,第四个操作是将该结果(饱和)映射到一个无符号字符型(8位)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.convertScaleAbs(src, alpha=1.0, beta=0.0)  
dsti=saturateuchar(|αsrci+β|)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector = np.random.random([100, 100]) * 200
res = cv2.convertScaleAbs(vector, alpha=1.0, beta=0.0)

-->
res
array([[ 22, 155,  35, ..., 123,  98, 187],
       [137, 191, 163, ...,  19,  65, 105],
       [176, 128, 137, ...,  56,  44,  85],
       ...,
       [130,  47, 113, ..., 165,  60, 174],
       [169, 172,  47, ...,  97, 107, 144],
       [ 66,  78,  86, ..., 154, 113,  82]], dtype=uint8)
14. cv2.countNonZero()

计算矩阵中非零元素个数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector = np.random.random([100, 100]) 
vector = np.clip(vector - 0.3, 0, 1)

num = cv2.countNonZero(vector)

-->
num
7007
15. cv2.cvtColor()

cv2.cvtColor() 函数用于将图像在保留相同数据类型的同时从一个颜色空间(通道数)转换到另一个颜色空间。

  • 函数使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dst = cv2.cvtColor(src, code, dstCn=0) 

输入矩阵src可以是8位矩阵,16位无符号矩阵或32位浮点矩阵。输出矩阵dst将具有与输入矩阵相同的尺寸和深度。要完成的转换操作由编码参数指定。最终参数dstCn是目标图像中所需的通道数。如果给出默认值0,则通道数由src中的通道数和转换编码确定。

  • 示例代码
16. cv2.dct()

计算矩阵的离散余弦变换

  • 函数使用 该函数根据flags参数的值执行离散余弦变换或离散余弦逆变换。源矩阵src必须是一维或二维的,并且尺寸应该是偶数(如果需要,可以填充矩阵)。结果矩阵dst将具有与src相同的类型和尺寸。参数flags是一个位域值,可以设置为cv2.DCT_INVERSEcv2.DCT_ROWS中的一个或两个。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.dct(src, flags) --> dst

  • 参数说明
    • src 需要为一维或二维的 float32 或 float64 数据
    • flags 不设置默认正向变换
    • flags 如果设置为cv2.DCT_INVERSE,则实现逆变换而不是前向变换。
    • flags 如果设置标志为cv2.DCT_ROWS,则将二维n×m的输入视为长度为m的n个不同的一维向量。在这种情况下,每个这样的向量将被独立地变换。
  • 最佳尺寸 cv2.dct() 的性能很大程度上取决于传递给它的矩阵的确切尺寸,这种关系(性能与尺寸的关系)并不是单调的。只有一些尺寸是比其他尺寸表现出的性能更好。建议在将矩阵传递给 cv2.dct() 时,首先在比当前矩阵大的尺寸中确定最佳尺寸,然后将矩阵扩展为该尺寸。OpenCV 为你提供了一个合适的例程来计算这个值,称为 cv2.getOptimalDFTSize()
  • 示例代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image = mt.cv_rgb_imread('img1.jpg')
image = mt.image_resize(image, [300, 300]).astype('float32')
image = mt.to_gray_image(image)
dct_res = cv2.dct(image)
inverse_img = cv2.dct(dct_res, flags=cv2.DCT_INVERSE)
PIS(image, (dct_res*150).astype('uint8'), inverse_img.astype('uint8'))

17. cv2.determinant()

计算方阵的行列式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector =(np.random.random([3, 3]) * 5).astype('int32').astype('float32')
res = cv2.determinant(vector)

-->
vector
array([[1., 2., 2.],
       [0., 4., 3.],
       [0., 3., 1.]], dtype=float32)
res
-5.0

18. cv2.dft()

计算矩阵的离散傅里叶变换

  • 函数使用 cv2.dft()函数实现离散傅里叶变换以及其逆变换(取决于flags参数)。源矩阵src必须是一维或二维的。结果矩阵dst将具有与src相同的类型和尺寸。 参数flags是一个位域值,可以设置为cv2.DFT_INVERSE,cv2.DFT_ROWS,cv2.DFT_SCALE,cv2.DFT_COMPLEX_OUTPUTcv2.DFT_REALOUTPUT中的一个或多个。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.dft(src, flags=0, nonzeroRows=0)

  • flags 说明
    • 如果设置为cv2.DFT_INVERSE,则完成逆变换。
    • 如果设置标志为cv2.DFT_ROWS,则二维n×m输入被视为长度为m的n个不同的一维向量,并且每个这样的向量将独立变换。
    • 标志cv2.DFT_SCALE通过将结果除以矩阵中的元素数来标准化结果,这通常用于DFT_INVERSE,因为它保证逆的逆将具有正确的标准化。
    • 标志cv2.DFT_COMPLEX_OUTPUT:和cv2.DFT_REAL_OUTPUT是有用的,因为当计算实数矩阵的傅里叶变换时,结果将有复共轭对称性。因此,即使结果是复数,结果矩阵的元素数量等于输入矩阵中的元素数量,而不是该数量的两倍。这样的压缩是cv2.dft()的默认行为。
    • 若要强制输出复数的形式,则需设置标志cv2.DFT_COMPLEX_OUTPUT。在逆变换的情况下,输入(通常)为复数,输出也为复数。然而,如果输入矩阵(对逆变换的情况)具有复共轭对称性(例如,如果它本身是实数矩阵的傅里叶变换的结果),那么逆变换将是一个实数矩阵。如果知道是这种情况,并且希望结果矩阵表示为一个实数矩阵(从而使用一半的内存量),则可以设置cv2.DFT_REAL_OUTPUT标志。
    • 请注意,如果设置cv2.DFT_REAL_OUTPUT标志,cv2.dft()不会检查输入矩阵是否具有必要的对称性,它只是假定具有对称性。
  • nonzeroRows cv2.dft()的最后一个参数是nonzeroRows,它默认为0,但如果设置它为任何非0值,将导致cv2.dft()认为只有输入矩阵的前nonzeroRows行是有意义的。如果cv2.DFT_INVERSE被设置,那么就认为只有输出矩阵的前nonzeroRows行是非零的。在使用cv2.dft()计算卷积的互相关时,这个标志特别方便。
  • 最佳尺寸 cv2.dft()的性能很大程度上取决于传递给它的矩阵的确切尺寸,这种关系(性能与尺寸的关系)并不是线性的。只有一些尺寸是比其他尺寸表现出的性能更好。建议在将矩阵传递给cv2.dft()时,首先在比当前矩阵大的尺寸中确定最佳尺寸,然后将矩阵扩展为该尺寸。OpenCV提供了一个合适的例程来计算这个值,称为cv2.getOptimalDFTSize()
  • 示例代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image = mt.cv_rgb_imread('img1.jpg')
image = mt.image_resize(image, [300, 300]).astype('float32')
image = mt.to_gray_image(image)

dft_res = cv2.dft(image)
inverse_img = cv2.dft(dft_res, flags=cv2.DFT_INVERSE)

PIS(image, dft_res, inverse_img)

19. cv2.divide()

实现两个矩阵逐元素相除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mat_1 = np.random.random([5, 5, 5, 5])
mat_2 = np.random.random([5, 5, 5, 5])

res = cv2.divide(mat_1,mat_2) 

20. cv2.eigen()

计算方阵的特征值和特征向量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.eigen(mat, lowindex=-1, highindex=-1)
  • 给定一个对称矩阵mat,cv2.eigen()会计算出该矩阵的特征向量和特征值。矩阵必须为浮点类型之一。特征值矩阵以递减的顺序包含mat的特征值。如果要提供矩阵的特征向量,特征向量则以行的形式存储在矩阵中,并且与对应的特征值在特征值矩阵中的顺序相同。附加参数lowindexhighindex允许只计算一些特征值(两者必须一起使用)。例如,如果lowindex=0highindex=1,就只计算最大的两个特征向量。
  • 参考代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mat = np.random.random([5, 5])
res = cv2.eigen(mat)

-->
res
(True, array([[ 2.38338798]...9424513]]), array([[ 0.48055992,...815113 ]]))
special variables
function variables
0:True
1:array([[ 2.38338798],
       [ 0.95330573],
       [ 0.09642702],
       [-0.29716848],
       [-0.99424513]])
2:array([[ 0.48055992,  0.47769814,  0.35204413,  0.55726429,  0.32617187],
       [ 0.11930107, -0.17197101,  0.86940861, -0.32391572, -0.3088697 ],
       [-0.1228634 ,  0.55909817,  0.04237424, -0.67306158,  0.46637576],
       [-0.49973229, -0.42185973,  0.30025171,  0.21678729,  0.65966218],
       [ 0.70000117, -0.50167127, -0.16806823, -0.2907344 ,  0.3815113 ]])
len():3

示例源码

参考资料

  • 《学习 OpenCV3》 第五章
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenCV - 矩阵操作 Part 2
当应用于矩阵时,src的每个元素都与upperb和lowerb中的对应元素进行校验。如果src中的元素在由upperb和lowerb给出的值之间,则dst的相应元素设置为255;否则设置为0。
为为为什么
2022/08/09
2.3K0
OpenCV - 矩阵操作 Part 2
OpenCV 图像频域操作
频域乘法表现在空域中等效于卷积计算,但是计算量会大大降低,本文记录 OpenCV 实现频域操作图像的相关内容。 概述 图像处理一般分为空间域处理和频率域处理,空间域处理是直接对图像内的像素进行处理。频率域处理是先将图像变换到频率域,然后在频率域对图像进行处理,最后通过反变换将图像变为空间域。傅里叶变换可以将图像变换为频率域, 傅立叶反变换再将频率域变换为空间域。 在频域里,对于一幅图像,高频部分代表了图像的、纹理信息;低频部分则代表了图像的轮廓信息。如果图像受到的噪声恰好在某个特定的频率范围内
为为为什么
2022/08/09
6160
OpenCV 图像频域操作
OpenCV - 矩阵操作 Part 3
对二维矢量场计算笛卡尔一极坐标转换的方位角(角度)部分。该矢量场是由两个独立的单通道矩阵组成。当然这两个输入矩阵的尺寸相同。(如果你有一个二通道的矩阵,那么调用cv2.phase()将会做你所需要的。)然后,dst中的每一个元素都从x和y的相应元素中计算两者的反正切值得到。
为为为什么
2022/08/09
1.9K0
OpenCV - 矩阵操作 Part 3
OpenCV 图像变换之 —— 通用变换
我们目前所看到的仿射变换和透射变换是一些更为一般的处理过程中特殊的例子。本质上,这两种变换有着相似的特性:它们把源图像的像素从一个地方映射到目标图像的另一个地方。事实上,其他一些操作也有着相同的结构。本文学习一些类似的变换,而后学习如何让OpenCV实现自己的映射变换。
为为为什么
2022/08/09
3.2K0
OpenCV 图像变换之 —— 通用变换
OpenCV 图像变换之 —— 拉伸、收缩、扭曲和旋转
图像变换最直接的应用就是改变图像的形状、大小、方向等等,这些在OpenCV 中有部分现成的实现。
为为为什么
2022/08/09
11.2K0
OpenCV 图像变换之 —— 拉伸、收缩、扭曲和旋转
OpenCV 滤波与卷积之 —— 平滑
平滑一般也称“模糊”,是一种简单而又常用的图像处理操作。平滑图像的目的有很多,但通常都是为了减少噪声和伪影。在降低图像分辨率的时候,平滑也是十分重要的。OpenCV 提供5种不同的平滑操作,每种操作都有对应的函数实现,这些操作平滑的结果有着细微的差别。
为为为什么
2022/08/09
9620
OpenCV 滤波与卷积之 —— 平滑
OpenCV 滤波与卷积之 —— 梯度和导数
平滑一般也称“模糊”,是一种简单而又常用的图像处理操作。平滑图像的目的有很多,但通常都是为了减少噪声和伪影。在降低图像分辨率的时候,平滑也是十分重要的。OpenCV 提供5种不同的平滑操作,每种操作都有对应的函数实现,这些操作平滑的结果有着细微的差别。
为为为什么
2022/08/09
7390
OpenCV 滤波与卷积之 —— 梯度和导数
【OpenCV】Chapter6.频率域图像滤波
OpenCV 中的cv.dft()函数也可以实现图像的傅里叶变换,cv.idft()函数实现图像傅里叶逆变换。
zstar
2022/09/26
1.5K0
【OpenCV】Chapter6.频率域图像滤波
OpenCV 滤波与卷积之 —— 形态学操作
OpenCV 还提供了一种高效且易用的图像形态学变换接口。图像形态学有其特定的发展领域,特别是在计算机视觉发展早期,已经发展出了很多的形态学方法。大部分都是为某个特定目的而产生的,其中一些更是沿用了很长一段时间。基本上,所有的形态学操作都基于两种原始操作,接下来的讲述也将以这两点开始,循序渐进发展到更加复杂的操作,每个更加复杂的操作都将通过前面的方法来表示。
为为为什么
2022/08/09
8820
OpenCV 滤波与卷积之 —— 形态学操作
Opencv 图像超像素分割(SLIC、SEEDS、LSC)
超像素是把一张图片中具有相似特征的像素进行聚类,形成一个更具有代表性的大“像素”。 本文记录Opencv 实现方法。 简介 超像素是把一张图片中具有相似特征的像素进行聚类,形成一个更具有代表性的大“像素”。这个新的像素可以作为其他图像处理算法的基本单位,可以减低图像的维度和异常像素点。目前常用的超像素分割算法有SLIC、SEEDS和LSC。下面来说说这些算法基于Opencv的Python实现。 测试图像: SLIC 算法具体原理可参考博客:SuperPixel 超像素分割 SLIC 算
为为为什么
2022/08/10
5.3K0
Opencv 图像超像素分割(SLIC、SEEDS、LSC)
OpenCV 直方图
直方图在计算机视觉中应用广泛。例如,通过判断帧与帧之间边缘和颜色的统计量是否出现巨大变化,来检测视频中场景的变换。通过使用兴趣点邻域内的特征组成的直方图,来辨识兴趣点。若将边缘、颜色、角点等等的直方图作为特征,可以使用分类器来进行目标识别。提取视频中的颜色或边缘直方图序列,可以用来判断视频是否拷贝自网络。这样的应用数不胜数,直方图可以说是计算机视觉领域中的经典工具之一。
为为为什么
2022/08/09
1.4K0
OpenCV 直方图
对数极坐标变换用于相位、尺度搜索
对于二维图形,Log-polar 转换表示从笛卡尔坐标到极坐标的变化,广泛应用在计算机视觉中。此函数模仿人类视网膜中央凹视力,并且对于目标跟踪等可用于快速尺度和旋转变换不变模板匹配。
为为为什么
2022/08/09
1.4K0
对数极坐标变换用于相位、尺度搜索
OpenCV 滤波与卷积之 —— 自定义核卷积
到目前为止,我们所接触到的卷积都是在OpenCV中API内部实现了的。学习了一些卷积操作之后,就立即联系OpenCV中实现了相应功能的函数。在调用这些函数时,函数默认地选择了某一种核,我们做的只是向函数传递一些参数来调整这个核。在OpenCV中,实际是允许我们用一个真实存在的核进行卷积操作的。
为为为什么
2022/08/09
2.4K0
OpenCV 滤波与卷积之 —— 自定义核卷积
OpenCV 图像分析之 —— 分割
图像分割是个很大的话题,这里,我们重点研究 OpenCV 中的几种专门实现分割方法的技术实现或者后面要用到的形态学策略。
为为为什么
2022/08/09
2.6K0
OpenCV 图像分析之 —— 分割
OpenCV 轮廓 —— 轮廓查找
取值 含义 cv2.CHAIN_APPROX_NONE 存储了所有的轮廓点。也就是说,等高线的任意2个后续点(x1,y1)和(x2,y2)将是水平、垂直或对角线邻居,即 max (abs (x1-x2),abs (y2-y1)) = 1。 cv2.CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线段,只留下它们的端点。例如,一个直立的矩形轮廓用 4 个点进行编码。 cv2.CHAIN_APPROX_TC89_L1 运用了 Teh-Chin 连锁近似演算法的一种 cv2.CHAIN_APPROX_TC89_KCOS 运用了 Teh-Chin 连锁近似演算法的一种
为为为什么
2022/08/09
3.2K0
OpenCV 轮廓 —— 轮廓查找
机器视觉算法(第10期)----图像处理中64个常用的算子
上期我们一起学习了OpenCV中最重要的数据类型数组Mat类, 机器视觉算法(第9期)----OpenCV中最最最重要的类型 从今天我们仍将以OpenCV为工具,来介绍图像处理中常用到的算子都有哪些?
智能算法
2019/06/20
2.9K0
OpenCV 图像分析之 —— 霍夫变换(Hough Transform)
Hough(霍夫)变换是一种用于检测线、圆或者图像中其他简单形状的方法。最初Hough变换是一种线变换,这是一种相对较快的检测二值图像中直线的方法,可以进一步推广到除简单线之外的情况。
为为为什么
2022/08/09
5.2K0
OpenCV 图像分析之 —— 霍夫变换(Hough Transform)
OpenCV 图像分析之 —— 距离变换
函数 cv2.distanceTransform() 用于计算图像中每一个非零点像素与其最近的零点像素之间的距离(Distance Transform, DT算法),本文记录OpenCV 距离变换相关内容。 距离变换 OpenCV中,函数cv2.distanceTransform()用于计算图像中每一个非零点像素与其最近的零点像素之间的距离,输出的是保存每一个非零点与最近零点的距离信息;图像上越亮的点,代表了离零点的距离越远。 图像的距离变换定义为一幅新图像,其中每个输出像素的值被设为输入图像
为为为什么
2022/08/09
5.4K0
OpenCV 图像分析之 —— 距离变换
OpenCV 滤波与卷积之 —— 边界与阈值化
滤波器指的是一种由一幅图像(x,y)根据像素点x,y附近的区域计算得到一幅新图像’(x,y)的算法。其中,模板规定了滤波器的形状以及这个区域内像素的值的组成规律,也称“滤波器”或者核。本章中出现的滤波器多数为线性核,也就是说I"(x,y)的像素的值由(x,y)及其周围的像素的值加权相加得来。这个过程可以用下面的方程表示:
为为为什么
2022/08/09
1.5K0
OpenCV 滤波与卷积之 —— 边界与阈值化
机器学习-09-图像处理02-PIL+numpy+OpenCV实践
开源地理空间基金会中文分会 Pillow (PIL Fork) 10.0.1 文档
用户2225445
2024/04/14
5350
机器学习-09-图像处理02-PIL+numpy+OpenCV实践
推荐阅读
相关推荐
OpenCV - 矩阵操作 Part 2
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文