当前位置: 首页 > news >正文

opencv代码分析

1.1计算机视觉

      在计算机里,每一张图像都是由像素点组成,每一个像素点会有不同的颜色值,像手机拍照1亿像素的,就说明拍摄出来的一张照片里面有一亿个像素点。

像这里照片这样的,一个像素点的值是0-255,在黑白图来说0表示纯黑,255表示纯白,在彩色照片里一个像素点有3个通道RGB来映射出一个点的颜色,例如R通道的其中一个数值0-255表示亮度等级,0为完全没有红色成分,255为最大强度的红色。这样通过RGB三种通道组合出来的就不同的颜色,可以产生1677万种颜色(256×256×256)。

组合效果举例

视频的形式其实也是一张一张图片。利用人眼对事物的余晖效应,其是人眼也是有个采样率的,只要比换照片的速度比人眼的采样率快,那就会让人感觉是在动的一样,但不能太快,这里换照片的速度就是帧数,游戏了一般都是30帧速率,表示一秒钟能换30张照片出来。

导库

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

1.读取照片

#以BGR格式来读取照片
img=cv2.imread('0188.jpg')
print(img)
cv2.imshow('imge',img)
cv2.waitKey(0)#按下任意键关闭展示
print(img.shape)#输出图像高和宽像素值数量和通道数#以灰度值图像读取进来并展示
img=cv2.imread('0188.jpg',cv2.IMREAD_GRAYSCALE)
print(img)
cv2.imshow('image',img)
cv2.waitKey(0)#按下任意键关闭展示
print(img.shape)#输出图像长宽像素值数量和通道数#截取部分照片数据
img =cv2.imread('0188.jpg')
apple =img[0:50,0:200] #根据长和宽的像素值来定义
print(apple)
cv2.imshow('imge',apple)
cv2.waitKey(0)#按下任意键关闭展示
print(apple.shape)#输出图像长宽像素值数量和通道数#颜色通道提取,这里的意思是把每个通道的数据各自拿出来
b,g,r =cv2.split(img)#把bgr的各自的通道合并到一处
img =cv2.merge((b,g,r))

2.读取视频

import cv2vc = cv2.VideoCapture('111.mp4')# 更健壮的读取检查
if not vc.isOpened():print("错误:无法打开视频文件")exit()while True:ret, frame = vc.read()  # 统一使用ret判断读取状态# 双重保险检查if not ret or frame is None:break# 正确的颜色转换方式 ↓↓↓gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('result', gray)if cv2.waitKey(10) & 0xFF == 27:breakvc.release()
cv2.destroyAllWindows()

3.边界填充

img = cv2.imread('0188.jpg')
top = bottom = left = right = 50
#1.常数值法cv2.BORDER_CONSTANT,这个会把边缘都图上指定的颜色,如果value不指定参数那就默认黑色cv2.BORDER_CONSTANT
constant = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[255, 0, 0])  # 蓝色填充
cv2.imshow('Constant Padding', constant)
cv2.waitKey(0)#2.边缘复制填充cv2.BORDER_REPLICATE,这个会把边缘的进行来填充
replicate = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REPLICATE)
cv2.imshow('Replicate Padding', replicate)
cv2.waitKey(0)#3. 反射填充(cv2.BORDER_REFLECT)gfedcba|abcdefgh|hfedcba
reflect = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT)
cv2.imshow('Reflect Padding', reflect)
cv2.waitKey(0)#4.反射101填充(cv2.BORDER_REFLECT_101)以图像边缘为轴进行镜像反射填充。gfedcb|abcdefgh|gfedcba
reflect101 = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT_101)
cv2.imshow('Reflect 101 Padding', reflect101)
cv2.waitKey(0)#5.包裹填充(cv2.BORDER_WRAP)cdefgh|abcdefgh|abcefghba
wrap = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_WRAP)
cv2.imshow('Wrap Padding', wrap)
cv2.waitKey(0)

4.像素值计算

#数值计算,这里会把3个通道的所有值都会+20,要是溢出255的,就是求余
img = cv2.imread('0188.jpg')
img1=img+20#重塑像素大小,这个在深度学习图像处理经常用到
img2=cv2.resize(img,(500,500))#这里的第一个是宽和高,和shape的不一样
cv2.imshow('imge1',img)
cv2.waitKey(0)
cv2.imshow('imge1',img2)
cv2.waitKey(0)#这里的是以原来宽的3倍,高的2倍重造
img3=cv2.resize(img,(0,0),fx=3,fy=2)
cv2.imshow('imge1',img3)
cv2.waitKey(0)

5.图像阈值处理

img = cv2.imread('0188.jpg', cv2.IMREAD_GRAYSCALE)#图像阈值处理必须以灰度图来处理#第一个参数为灰度图像数据,第二个就是阈值,超过这个会怎样怎样,第三个参数是大于第二个参数会把值全部变为255,#1.二值法:cv2.THRESH_BINARY:超过第二个参数值的设为自已想要的值,没超过第二个参数就默认改为0。
ret,thresholded_image1=cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Binary Threshold Image', thresholded_image1)#效果为黑的更黑,白的更白
cv2.waitKey(0)#2..二值法反转:cv2.THRESH_BINARY_INV::这个和二值法的反转,大于阈值的变为0,小于阈值的变为自已设定的值
ret,thresholded_image2=cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('BINARY_INV_Threshold Image', thresholded_image2)#效果为黑的变纯白,白的变纯黑
cv2.waitKey(0)#3.cv2.THRESH_TRUNC,大于阈值部分就设置为自已的设置值,小于的保留原来的值不变
ret,thresholded_image3=cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow('BINARY_INV_Threshold Image', thresholded_image3)#效果为白的变纯白,黑的保留
cv2.waitKey(0)#4.cv2.THRESH_TOZERO,大于阈值部分部分设置为就保留原来的值不变,小于的设为0
ret,thresholded_image4=cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
cv2.imshow('BINARY_INV_Threshold Image', thresholded_image4)#黑的变纯黑,白的保留
cv2.waitKey(0)#5.cv2.THRESH_TOZERO_INV 和第4个相反,大于阈值部分设为0,小于的就保留原来的值
ret,thresholded_image5=cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV )
cv2.imshow('BINARY_INV_Threshold Image', thresholded_image5)#黑的变纯白,黑的保留
cv2.waitKey(0)

6.平滑滤波

#1.均值滤波,其原理是卷积操作,核数必须是奇数,,会把中间噪声周围的数值相加平均,用于消除均匀噪声,简单平滑
#类似于美颜里的磨皮功能,会把痣给去掉,这个痣就是噪点,把皮肤周围数据平均得到新的数据皮肤,最好可以指定图像位置噪声来处理
blurred = cv2.blur(img, (5,5))  # 使用5x5均值核
cv2.imshow('blurred', blurred)
cv2.waitKey(0)#2.方框滤波,和均值滤波类似,这里多了可以选择归一化处理,最后参数选择,若无归一化,平均起来的数值较大就会以255显示全白
box = cv2.boxFilter(img, -1, (5,5), normalize=True)  # 归一化求和
cv2.imshow('box', box)
cv2.waitKey(0)#3.高斯滤波,原理加权平均,离噪声近的像素值给的权重大,远的就权重小,然后根据权重求均值,保持边缘较好
gaussian = cv2.GaussianBlur(img, (9,9), 2)  # 9x9核,σ=2
cv2.imshow('gaussian', gaussian)
cv2.waitKey(0)#4.中值滤波,原理是把噪声周围的数值从大到小或者从小到大排序,然后取出中间值来替代噪声数值
median = cv2.medianBlur(img, 5)  # 5x5中值滤波,这里参数必须大于1且为奇数
cv2.imshow('median', median)
cv2.waitKey(0)#5.双边滤波 原理是结合空间距离和像素值相似性的加权平均
#第二参数为直径,第三参数颜色空间标准差(越大颜色混合越明显),第三参数坐标空间标准差(越大远处像
#素影响越大
bilateral = cv2.bilateralFilter(img, 9, 75, 75)  # 强保边效果,
cv2.imshow('bilateral', bilateral)
cv2.waitKey(0)#6.非局部均值去噪,原理是利用图像全局相似性去噪
h:滤波强度(建议3-10)
#templateWindowSize:模板窗口大小(必须奇数)searchWindowSize:搜索窗口大小(必须奇数)
denoised = cv2.fastNlMeansDenoising(img, h=10, templateWindowSize=7)
cv2.imshow('denoised', denoised)
cv2.waitKey(0)#这里是使用numpy把四张照片横着拼接到一起
res=np.hstack((blurred,box,gaussian,median))
cv2.imshow('res',res)
cv2.waitKey(0)

7.形态学

#1. 腐蚀,原理是利用卷积核,例如3×3的,会把边缘的不同像素值的边缘减少,建议还是做二值化后处理,会减少白的区域
#作用是去毛刺或者瘦脸,但去毛刺同时会把线条变细了,ksize的卷积核大小,iterations是腐蚀次数
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
erosion = cv2.erode(img, kernel, iterations=2)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)#2.膨胀,会把黑线条这些加粗了,和腐蚀相反
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilation = cv2.dilate(img, kernel,iterations=2)
cv2.imshow('dilation', dilation)
cv2.waitKey(0)#3.开运算,原理是利用把上面的先后顺序一起弄,开是先腐蚀后膨胀,去除小噪点,保持原物体形状
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)#4.闭运算,原理是利用把上面的先后顺序一起弄,开是先膨胀后腐蚀, 填补小孔洞,连接邻近区域
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)#5.梯度,原理是先膨胀再减去腐蚀的,可用于提取物体边缘轮廓
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)#6.顶帽,原理是原始输入减开运算,用于提取比背景亮的细小区域,例如提取毛刺特征
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)#7.黑帽,原理是闭运算减去原始输入,提取比背景暗的小孔洞,检测金属表面的划痕
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
cv2.waitKey(0)#8. 击中击不中,检测特定形状模式(需自定义核)
kernel = np.array(([ 0, 1, 0],[ 1, 1, 1],[ 0, 1, 0]), dtype="int")
hitmiss = cv2.morphologyEx(img, cv2.MORPH_HITMISS, kernel)
cv2.imshow('hitmiss', hitmiss)
cv2.waitKey(0)

8.算子(主要应用于边缘检测)

#1.sober算子,原理是卷积核右边减左边,下减上,可用于轮廓提取,基于一阶导数
#第二个参数为图像的深度,第三个和第四个是表示横竖方向的,第五个参数是卷积核大小
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobel_x  =cv2.convertScaleAbs(sobel_x)sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobel_y  =cv2.convertScaleAbs(sobel_y)
#进行求和,权重各自一半,增益为0
combined = cv2.addWeighted(sobel_x,0.5,sobel_y,0.5,0)
cv2.imshow('combined', combined)
cv2.waitKey(0)#2.Scharr算子:Sobel的改进版,卷积核的数值变大了,增强边缘检测精度
Scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
Scharr_x  =cv2.convertScaleAbs(sobel_x)Scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
Scharr_y  =cv2.convertScaleAbs(sobel_y)
#进行求和,权重各自一半,增益为0
combined1 = cv2.addWeighted(Scharr_x,0.5,Scharr_y ,0.5,0)
cv2.imshow('Scharr', combined1)
cv2.waitKey(0)#3.Laplacian算子,这个和上述的不一样,没有减,检测各方向边缘,基于二阶导数
Laplacian = cv2.Laplacian(img,cv2.CV_64F)
Laplacian = cv2.convertScaleAbs(Laplacian)
cv2.imshow('Laplacian', Laplacian)
cv2.waitKey(0)#4.Canny算子,多阶段边缘检测(高斯去噪→梯度计算→非极大抑制→双阈值),
#原理去噪声点→计算相邻像素值的差距梯度→把小梯度的给过滤掉→再过滤
v1=cv2.Canny(img,80,150)#参数为最小差距梯度和最大差距梯度,数值越小显示轮廓信息越丰富
v2=cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv2.imshow('Canny', res)
cv2.waitKey(0)

9.金字塔

#注意这个和cv2.resize不一样,金字塔算法会改变原图的像素值,是进行高斯卷积核了避免混叠失真,边缘是比较平滑的,而cv2.resize无预处理直接插值计算(无预处理),可能产生锯齿(缩放比例不合理时)
#1.向上采样(缩小),实质是从底向顶,先把原始图像和高斯内核卷积,然后把所有偶数的行和列去除,图像宽高像素个数为原来的一半
up = cv2.pyrUp(img)
print(up.shape)
cv2.imshow('up ', up )
cv2.waitKey(0)#2.向下采样(放大),将图像宽和高像素个数扩大为原来的两倍,新增的像素行列之间插0补充,然后把高斯卷积核×4再与放大后的图像卷积
down = cv2.pyrDown(img)
print(up.shape)
cv2.imshow('down ', down )
cv2.waitKey(0)#3.拉普拉斯金字塔,原图数据-(对原图数据先下再上采样)
down = cv2.pyrDown(img)
up = cv2.pyrUp(down)
la=img-up
cv2.imshow('la ', la )
cv2.waitKey(0)

10.轮廓特征

#轮廓检测
#第二个参数(轮廓检测方式):
#RETR EXTERNAL:只检索最外面的轮廓:
#RETR LIST:检索所有的轮廓,并将其保存到一条链表当中:
# RETR CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界
# RETR TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;常用这个
#第三个参数:method:轮廓逼近方法
#CHAIN APPROX NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(所有边都展示)。
#CHAIN APPROX SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分(只展示顶点)。
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,refresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(refresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)#必须为单通道的二值图像
cv2.imshow('refresh ', refresh )
cv2.waitKey(0)draw_img=img.copy()#使用原图,不然原图会变
#框选出来轮廓,第二个参数为轮廓框,第三个参数是选定画多少个轮廓,-1表示全部,第四个参数是三个通道的颜色值,第五个参数线条厚度
res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv2.imshow('res ', res )
cv2.waitKey(0)#轮廓特征面积周长计算单位为平方像素(pixel²)如果轮廓是一个 10x10 的正方形,面积为 100 像素²
cnt=contours[1]#这个索引0表示计算第1个,毕竟框出来的轮廓可能不止一个
area=cv2.contourArea(cnt)
length=cv2.arcLength(cnt,True)#第二个参数表示轮廓是闭合的
print('面积为:',area)
print('周长为:',length)#统计轮廓内部所有像素的数量。一个 10x10 正方形的周长约为 40 像素(实际可能略有误差,因为对角线的距离是 √2 像素)。#若需要计算真实周长和面积画的,需固定拍摄画面,并且知道比例单位n毫米/像素,再转换为周长面积,拍摄距离不一样,比例单位不一样#轮廓的近似,可以把不规则的轮廓变成比较规则的轮廓,原理是例如曲线,起点和终点连直线,找出曲线点上里直线距离最大的,
#没超过阈值的就把这个直线替代,超过了的就取曲线上的点离终点和起点的两条线为直线,再进行这样的判断epsilon = 0.01 * cv2.arcLength(cnt, True)#第一个参数通常取周长的10%~50%,第二个还是闭合轮廓
approx = cv2.approxPolyDP(cnt, epsilon, closed=True) # closed=True表示闭合轮廓res1=cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)#和上述一样
cv2.imshow(" Approximated", res1)
cv2.waitKey(0)x, y, w, h = cv2.boundingRect(cnt)
img=cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)  # 绘制绿色矩形
cv2.imshow( "img", img)
cv2.waitKey(0)

直方图:横轴表示0-255像素值,纵坐标是表示0-255的个数有多少,其实就是统计一张
图像里某个像素值的个数有多少个
calcHsit函数:原图或者灰度图,第二个参数为BGR通道的其中一个,第三个参数是掩码,可以指定
图像某个区域的直方图,第四个参数是就是指定横坐标的的范围,第五参数是纵坐标的范围
第四第五个参数一般为255


直方图均衡化(对比度增强):原理:先统计出直方图,然后求概率和累计概率,例如灰度值从0-255,0的个数
在全部的出现的比例概率,例如是0.25,其累计概率就是0.25,1的个数为3,其在总数
的比例概率为0.1,那其累计概率是0.1+0.25,加上前面的总和概率得到自身的。0这个像素得出的
累计概率后成上255,的出来的数四舍五入取整后替代掉0这个像素值。

自适应均衡化:和直方图均衡化原理一样,只是这个是会把图像分割分别做均衡化,而
直方图均衡化是统计整个图像来做。

图像里的傅里叶变换:高频:变化剧烈的灰度分量,例如图像的边界,像素值从0突变到255,
黑色到白色的突变
低频:变化缓慢的灰度分量,例如一片大海,像素值变化缓慢,像素值缓慢过度,颜色表现也是
低通滤波:只保留低频的,会使图像模糊。高通滤波:保留高频,使图像细节增强。

透视变换:可以把歪歪扭扭的矩形给纠正,是根据h和w来纠正

文档扫描识别:1.边缘检测2.获取轮廓3.透视变换4.下载OCR工具包提取文字,pip pytesseract

角点检测:其原理根据x轴方向和y轴方向,若其灰度值都发生较大变化时,可认为是角点

I(u,v)是原像素点,I(u+△x,v+△y)是沿x和y方向平移后的。然后相减,²可以是得出个正数。w(u,v)类似于权重,像在平面的得出的结果几乎为0.最终化简出两个值,远大于,相等,远小于即可平判断是平面边界或者是角点。

#第一个参数为32位浮点图像文件,第二个参数为角点检测中指定区域的大小,也就是窗口大小
#第三个sobel中求导的使用的窗口大小,一般默认为3即可。判定比例系数0.04或者0.06
cv2.cornerHarris()

尺度空间变化:可以使原有清晰图像变的模糊化,增加数据集,这样给神经网络训练时可以有更多数据,不同的实际分类场景即使是模糊也能正确分类,使用的高斯滤波

多分辨率金字塔:和前面的金字塔一样,然后在它的基础上每一层然后再多次尺度空间变化

高斯查分金字塔:基于多分辨金字塔下,每个尺度变换的图像进行相减,可得出特征差异点来。

 

http://www.dtcms.com/a/619145.html

相关文章:

  • 素材网站的下载服务器怎么做wordpress数据库改域名
  • 网站运营招聘要求软件项目管理计划书
  • 江西南昌建设厅网站怎么做qq代刷网站
  • 主从DNS服务器
  • 邢台做网站哪家公司好上海缪斯设计公司官网
  • 做外贸做的很好的网站属于网络营销的特点是
  • 响应式网站有什么好处策划公司活动方案
  • 怎么做网站滑动图片部分wordpress 调试
  • 第42节:自定义渲染管线:修改Three.js默认流程
  • 网站开发后端最新技术设计公司注册需要什么条件
  • AdalFlow:让大模型任务像水流一样灵活可塑
  • 网奇e游通旅游网站建设系统如何修改上传到服务器小视频做网站怎么赚钱吗
  • 达州达县网站建设网站设计与平面设计区别
  • 西安市建设网站西安模板做网站
  • 移动开发工程笔记:glide/taro与性能优化
  • nuxt做多页面网站本地wordpress环境搭建
  • Flink原理与实战(java版)#第2章 Flink的入门(第七节Flink的第一个流式计算示例和第八节本章小结)
  • 普通的宣传网站用什么做百度应用商店官网
  • SpringBoot 整合时序数据库 Apache IoTDB 实战操作详解
  • Painter AI 散布:告别“重复感”的环境贴图
  • 长沙米拓建站wordpress apache 配置
  • 安卓手机做网站服务器吗建站系统源代码
  • 建设网站服务器郑州网站建设知名公司
  • 网站与系统对接图文方案网创电商是什么
  • 海豚调度器创建租户错误的原因
  • 2025 年江西省职业院校技能大赛人工智能应用技术赛项竞赛方案(中职组)
  • 字符指针与字符串
  • 前端 css中的函数
  • 做网站维护要学些什么wordpress防止图片被采集
  • 网站建设经典教材企业官网登录