当前位置:   article > 正文

Opencv基础知识_opencv知识点

opencv知识点


这篇文章是对前段时间所学习opencv知识的一个系统整理,主要是对代码的整理和保存,方便以后的查阅。
本次学习主要参考了以下几篇文章:
Python+OpenCV图像处理(一篇全).

一、Opencv基础知识

图像读取、显示

#读取图片
img = cv2.imread("01.jpg") #读取的的时候,路径用到了两个斜杠,第一个斜杠表示转义字符
 
#显示图像
cv2.imshow("image", img) #窗口名,文件名
  • 1
  • 2
  • 3
  • 4
  • 5

图像拆分、显示与保存

# 拆分通道
b, g, r = cv2.split(img)
 
# 显示原始图像
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)

 
#等待显示, 如果没有这句的话,图片就会显示一下立马消失
cv2.waitKey(0) #0表示无限制的等待(按任意键就退出),大于0(如5)表示等待5秒自动关闭窗口,小于零表示敲击键盘就会关闭 
               
                
 
cv2.destroyAllWindows() #从内存将窗口清除
 
#保存图像
cv2.imwrite("D:\\lalala.jpg", img) #文件地址, 文件名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

此时需添加等待显示:

# 方法一:按任意键直接销毁所有打开的HighGUI窗口
cv2.waitKey(0)  # 等待用户输入,按任意键即可
cv2.destroyAllWindows()

  • 1
  • 2
  • 3
  • 4

图像加法与类型转换

方法一:Numpy加法运算,目标图像 = 图像1 + 图像2,运算结果进行取模运算。有以下两种情况:
#(1)当像素值 <= 255时,结果为“图像1+图像2”,例如:120+48=168
#(2)当像素值 > 255时,结果为对255取模的结果,例如:(255+64) % 255=64

result1 = img + test
  • 1

方法二:OpenCV加法运算,目标图像 = cv2.add(图像1, 图像2) 。 此时结果是饱和运算,有以下两种情况:
#(1)当像素值 <= 255时,结果为“图像1+图像2”,例如:120+48=168
#(2)当像素值 > 255时,结果为255,例如:(255+64) = 255

result2 = cv2.add(img, test)
  • 1

图像融合

result3 = cv2.addWeighted(result1, 1,result2, 1, 0) 
  • 1

图像类型转换(灰度图) cvtColor()
#1) cv2.COLOR_BGR2GRAY 彩色转灰度 类似于Matlab 中的 rgb2gray()
#2) cv2.COLOR_BGR2RGB
#3) cv2.COLOR_GRAY2BGR

result4 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 图像类型转换(BRG通道转RGB通道)
result5 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  • 1
  • 2
  • 3

图像缩放resize():

result6 = cv2.resize(img, (200,100))
print (result6.shape)
# 读取图片数据,# 图像缩放 dsize(,)
rows, cols, channel = img.shape
print(rows, cols)
result7 = cv2.resize(img, (int(cols * 0.6), int(rows * 1.2)))
# 图像缩放,(fx,fy) 缩放倍数的方法对图像进行放大或缩小。
result8 = cv2.resize(img, None, fx=0.3, fy=0.3)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

图像旋转、翻转

#绕图像的中心旋转,参数:旋转中心 旋转度数 scale缩放比例

M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
# 参数:原始图像 旋转参数 元素图像宽高
result9 = cv2.warpAffine(img, M, (cols, rows))
  • 1
  • 2
  • 3

图像翻转,flip() 0以X轴为对称轴翻转 >0以Y轴为对称轴翻转 <0X轴Y轴翻转

img1 = cv2.flip(img, 0)
img2 = cv2.flip(img, 1)
img3 = cv2.flip(img, -1)
  • 1
  • 2
  • 3

显示图形 (注意一个窗口多张图像的用法)

img1 = cv2.flip(img, 0)
img2 = cv2.flip(img, 1)
img3 = cv2.flip(img, -1)
# 显示图形 (注意一个窗口多张图像的用法)
titles = ['Source', 'Image1', 'Image2', 'Image3']
images = [img, img1, img2, img3]
for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

图像平移

图像平移首先定义平移矩阵M,再调用 warpAffine() 函数实现平移
图像平移 下、上、右、左平移

M1 = np.float32([[1, 0, 0], [0, 1, 100]])
img4 = cv2.warpAffine(img, M1, (img.shape[1], img.shape[0]))
M2 = np.float32([[1, 0, 0], [0, 1, -100]])
img5 = cv2.warpAffine(img, M1, (img.shape[1], img.shape[0]))
M3 = np.float32([[1, 0, 100], [0, 1, 0]])
img6 = cv2.warpAffine(img, M1, (img.shape[1], img.shape[0]))
M4 = np.float32([[1, 0, -100], [0, 1, 0]])
img7 = cv2.warpAffine(img, M1, (img.shape[1], img.shape[0]))
# 显示图形
titles = ['img4', 'img5', 'img6', 'img7']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二、图像进阶知识

阈值化处理

ret,thresh1=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)     #二进制阈值化
ret,thresh2=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY_INV) #反二进制阈值化
ret,thresh3=cv2.threshold(GrayImage,127,255,cv2.THRESH_TRUNC)      #截断阈值化
ret,thresh4=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO)     #阈值化为0
ret,thresh5=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO_INV) #反阈值化为0
  • 1
  • 2
  • 3
  • 4
  • 5

高斯滤波

# 高斯滤波
result = cv2.GaussianBlur(source, (3, 3), 0) #可以更改核大小,核越大可能越不清晰
  • 1
  • 2

形态学6种操作

#腐蚀 cv2.erode(src, kernel, iterations) iterations表示腐蚀几次
#取结构元所指定的领域内值的最小值作为该位置的输出灰度值。取每个位置领域内最小值,腐蚀后输出图像的总体亮度的平均值比起原图会有所降低,图像中比较亮的区域的面积会变小甚至消失,而较暗物体的尺寸会扩大。

fushi = cv2.erode(src, kernel) 
  • 1

#膨胀 cv2.dilate(src, kernel, iterations)
#取每个位置领域内最大值,膨胀后输出图像的总体亮度的平均值比起原图会有所升高,图像中比较亮的区域的面积会变大,而较暗物体的尺寸会减小甚至消失。

pengzhang = cv2.dilate(src, kernel)
  • 1

#开运算 cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel) 先腐蚀再膨胀,平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。
#闭运算 cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel) 先膨胀再腐蚀,平滑轮廓的一部分。弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。

kai = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
bi = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
  • 1
  • 2

顶帽运算 原始减去开运算
黑帽运算 闭运算减去原始

tophat = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
  • 1
  • 2

掩摸与感兴趣区域

生成掩摸,提取感兴趣区,屏蔽作用,结构特征提取,特殊形状图像的制作。

mask = np.zeros(src.shape[:2],np.uint8)
mask[200:400, 200:400]=255
  • 1
  • 2

灰度直方图

#灰度直方图 dst=cv2.equalizeHist(src):已知灰度概率密度分布的图像经过一种变换,使之演变为一幅具有均匀灰度概率密度分布的新图像。
#encoding:utf-8
#由原始图像的统计直方图计算归一化直方图和累计直方图,再将累计直方图进行区间转换以及将灰度级转换为256,至此转换完成,
#完成后的图像相似,但转换后的图像再更大区间上分布着,表明更加均衡

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('01.jpg', cv2.IMREAD_GRAYSCALE) # cv2.IMREAD_GRAYSCALE读取为灰度图像,其通道返回值为单个
img1 = cv2.imread('01.jpg')
b,g,r = cv2.split(img1) #通道分割
img_RGB=cv2.merge([r,g,b])#通道组合

#img_RGB = cv2.imread('01.jpg',cv2.COLOR_BGR2RGB )      # ????????   读取图像为rgb格式--无


equ = cv2.equalizeHist(img)
 

#cv2.imshow("src", img)
#cv2.imshow("result", equ)
 

plt.hist(img.ravel(), 256)
#plt.figure()
plt.hist(equ.ravel(), 256)
plt.subplot(221),plt.imshow(img_RGB, 'gray'),plt.title('img_rgb'), plt.xticks([]),plt.yticks([])
plt.subplot(222),plt.imshow(equ, 'gray'),plt.title('equ'), plt.xticks([]),plt.yticks([])
plt.subplot(223),plt.hist(img.ravel(),256),plt.title('img_hist')
plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist')

plt.show()
 
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

频域滤波

#时域转化为频域
傅里叶得到低频、高频信息,针对低频、高频能够实现不同的目的
#(2)傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换,能够恢复到原始图像
#(3)在频域对图像进行处理,在频域的处理会反应在逆变换图像上
#高通滤波:傅里叶变换为复数数组–将低频分量移到中心–获取中心点–设置低频区域并过滤–将低频转换至左上角–逆傅里叶==逆傅里叶变换结果转换为灰度值

import cv2 
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('01.jpg', 0)

f = np.fft.fft2(img)   #实现傅里叶变换,返回一个复数数组 
fshift = np.fft.fftshift(f)   #将低频分量移到频谱中心(傅里叶变换后的低频是在频谱左上角,为了观看方便,移到中心)
result = 20*np.log(np.abs(fshift))#将复数转换为灰度值[0-255]范围

rows, cols = img.shape[0:2] #获取图像中心点
rows,cols = int(rows/2), int(cols/2)  #获取图像中心点
fshift[rows-30:rows+30, cols-30:cols+30] = 0  #将中心点周围30区域置为0,即将低频信息去掉,实现高通滤波
ishift = np.fft.ifftshift(fshift)   #将低频移还原到左上角
iimg = np.fft.ifft2(ishift)   #逆傅里叶变换
iimg = np.abs(iimg)    #将逆傅里叶变换的结果转换为灰度值,显示为图像

plt.subplot(221),plt.imshow(img, cmap = 'gray'),plt.title('original'),plt.axis('off')
plt.subplot(222),plt.imshow(result, cmap = 'gray'),plt.title('result'),plt.axis('off')
plt.subplot(223), plt.imshow(iimg, cmap='gray'),plt.title('iimg'),plt.axis('off')
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/554588
推荐阅读
相关标签
  

闽ICP备14008679号