技术标签: python 机器学习 计算机视觉 图像处理 人工智能
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者丨吃猫的鱼python @CSDN
编辑丨3D视觉开发者社区
目
录
content
一、什么是计算机视觉
二、图片处理基础操作
图片处理:读入图像
图片处理:显示图像
图片处理:图像保存
三、图像处理入门基础
图像成像原理介绍
图像分类
四、像素处理操作
读取像素
修改像素
使用python中的numpy修改像素点
五、获取图像属性
形状
像素数目
图像类型
六、图像ROI
七、通道的拆分与合并
一、什么是计算机视觉
计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取‘信息’的人工智能系统。这里所指的信息指Shannon定义的,可以用来帮助做一个“决定”的信息。因为感知可以看作是从感官信号中提取信息,所以计算机视觉也可以看作是研究如何使人工系统从图像或多维数据中“感知”的科学。
视觉是各个应用领域,如制造业、检验、文档分析、医疗诊断,和军事等领域中各种智能/自主系统中不可分割的一部分。由于它的重要性,一些先进国家,例如美国把对计算机视觉的研究列为对经济和科学有广泛影响的科学和工程中的重大基本问题,即所谓的重大挑战(grand challenge)。
计算机视觉的挑战是要为计算机和机器人开发具有与人类水平相当的视觉能力。机器视觉需要图象信号,纹理和颜色建模,几何处理和推理,以及物体建模。一个有能力的视觉系统应该把所有这些处理都紧密地集成在一起。
我们目前如果是在校学生,对于计算机视觉和机器学习的相关知识的学习是非常有用的,无论是对于自己的工作前景还是相关论文的撰写都是非常有用的,而且目前对于计算机的相关知识已经设计到了各个专业领域,其中包括医学领域(计算机视觉分析CT成像)、电学领域(使用matlab及相关领域画图)、人脸识别和车牌识别等等。而且有想要做交叉学科的对于计算机可以和任意领域及进行无障碍交叉。
由于我这个理工男的语文功底并不好,语言组织能力不强,所以我们今天就啰嗦到这里,总结一下就是计算机视觉及机器学习等和计算机相关的东西特别重要!
二、图片处理基础操作
首先我们来看一段简单的计算机视觉相关代码:
import cv2img=cv2.imread('path')#path指图片相关路径cv2.imshow('Demo',img)cv2.nameWindow('Demo')cv2.waitKey(0)cv2.destroyAllWindows()
这段代码就可以在计算机中显示出img的相关图像。接下来我们讲解一下每一步的相关操作。
图片处理:读入图像
相关函数:image=cv2.imread(文件名相关路径[显示控制参数])
文件名:完整的路径。
其中参数包括:
cv.IMREAD_UNCHANGED :表示和原图像一致
cv.IMREAD_GRAYSCALE : 表示将原图像转化为灰色图像。
cv.IMREAD_COLOR:表示将原图像转化为彩色图像。
例如:
cv2.imread(‘d:\image.jpg’,cv.IMREAD_UNCHANGED)
图片处理:显示图像
相关函数:None=cv2.imshow(窗口名,图像名)
例如:
cv2.imshow(“demo”,image)
但是在OpenCV中我们图像显示还是要加上相关约束:
retval=cv2.waitKey([delay])
如果没有这个限制,那么显示的图像就会一闪而过,就会发生错误。
其中delay参数包括:
dealy=0,无限等待图像显示,直到关闭。也是waitKey的默认数值。
delay<0,等待键盘点击结束图像显示,也就是说当我们敲击键盘的时候,图像结束显示。
delay>0,等待delay毫秒后结束图像显示。
最后我们还需要显示
cv2.destroyAllWindows()
把图像从内存中彻底删除。
图片处理:图像保存
相关函数:retval=cv2.imwrite(文件地址,文件名)
例如
cv2.imwrite(‘D:\test.jpg’,img)
将img保存到了路径D:\test.jpg
三、图像处理入门基础
图像成像原理介绍
首先我们第一个要深深深深的刻在脑子里的概念就是:
——图片是由像素点构成的
生动一点表示就是这样:
这样就可以完美的展示出计算机图像的成像原理,就是用一个个有颜色的像素点拼接而成的。
图像分类
图像一般分为三类:
一、二值图像
二值图像表示的意思就是每一个像素点只由0和1构成,0表示黑色,1表示白色,而且这里的黑色和白色是纯黑和纯白。所以我们看到的图像也就是这个样子。我们以官网丽娜为例子。
二、灰度图像
灰度图像就是一个8位的位图。什么意思呢?就是说00000001一直到11111111,这就是二进制表示。如果表示成我们常用的十进制就是0-255。其中0就表示纯黑色,255就表示纯白色,中间就是处于纯黑色到纯白色的相关颜色。我们还是以丽娜为例。
灰度图像一块像素点:
三、彩色图像(RGB)
计算机中所有的颜色都可以由R(红色通道)、G(绿色通道)、B(蓝色通道)来组成,其中每一个通道都有0-255个像素颜色组成。比如说R=234,G=252,B=4就表示黄色。显示出来的也是黄色。所以说彩色图像由三个面构成,分别对应R,G,B。我们还是以丽娜为例子:
所以说我们就可以知道复杂程度排序的话就是:彩色图像-灰度图像-二值图像。所以我们在进行人脸项目或者是车牌识别项目中最最最常用的操作就是将彩色图像转化为灰度图像,然后将灰度图像转为最简单的二值图像。
四、像素处理操作
读取像素
相关函数:返回值=图像(位置参数) 我们先以灰度图像,返回灰度值:
p=img[88,142]
print§
这里我们就可以返回图片坐标[88,142]处的灰度值。
然后我们以彩色图像为例子:
我们知道彩色图像由BGR三个通道的值构成。那么我们需要返回三个数值:
blue=img[78,125,0]
green=img[78,125,1]
red=img[78,125,2]
print(blue,green,red)
这样我们就返回了这三个数值。
修改像素
直接暴力修改。
对于灰度图像, img[88,99]=255
对于彩色图像,
img[88,99,0]=255
img][88,99,1]=255
img[88,99,2]=255这里也可以写成
img[88,99]=[255,255,255]等同于上方。
改动多个像素点
例如还是以彩色图像为例子:
i[100:150,100:150]=[255,255,255]
意思也就是将图像横坐标100到150和纵坐标100到150的这个区间全部用白色替代。
使用python中的numpy修改像素点
读取像素
相关函数:返回值=图像.item(位置参数)
我们以灰度图像为例:
o=img,item(88,142)
print(o)
对于彩色图像我们还是:
blue=img.item(88,142,0)
green=img.item(88,142,1)
red=img.item(88,142,2)
然后print(blue,green,red)
修改像素
图像名.itemset(位置,新的数值)
我们以灰度图像为例子:
img.itemset((88,99),255)
对于BGR图像:
img.itemset((88,99,0),255)
img.itemset((88,99,1),255)
img.itemset((88,99,2),255)
import cv2
import numpy as np
i=cv2.imread('path',cv2.IMREAD_UNCHANGED)
print(i.item(100,100))
i.itemset((100,100),255)
print(i,item(100,100))
通过这段代码我们就可以看得出来像素的更改。
对于彩色图像也是一样。
五、获取图像属性
形状
shape可以获取图像的形状,返回值包含行数、列数通道数的元组。
灰度图像返回行数列数
彩色图像返回行数、列数、通道数。
import cv2
img1=cv2.imread('灰度图像')
print(img1.shape)
像素数目
size可以获取图像的像素数目。
灰度图像:行数列数
彩色图像:行数列数*通道数
图像类型
dtype返回的是图像的数据类型
import cv2
img=cv2.imread('图像名称')
print(img.dtype)
六、图像ROI
ROI(region of interest)表示感兴趣区域
从被处理的图像中以方框、圆、椭圆或者不规则多边形等方式勾勒出需要处理的区域。
可以通过各种算子(operator)和函数来求ROI,并进行下一步操作。
import cv2
import numpy as np
a=cv2.imread('path')
b=np.ones((101,101,3))
b=a[220:400,250:350]
a[0:101,0:101]=b
cv2.imshow('o',a)
cv2.waitKey()
cv2.destroyAllWindows()
我们还可以将感兴趣的图像加入到别的图像当中。
七、通道的拆分与合并
拆分
import cv2
img=cv2.imread('图像名')
b = img[ : , : , 0 ]
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
我们在OpenCV中有专门拆分通道的函数:
cv2.split(img)
import cv2
import numpy as np
a=cv2.imread("image\lenacolor.png")
b,g,r=cv2.split(a)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()
合并
import cv2
import numpy as np
a=cv2.imread("image\lenacolor.png")
b,g,r=cv2.split(a)
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey()
cv2.destroyAllWindows()
我们将上方的拆分图像进行merge合并就可以得到以下结果:
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
文章浏览阅读5.5k次,点赞2次,收藏9次。这几天尝试了下STM32的USART3去接gsm模块。整了好久没整出来,甚是纠结。途中遇到两个问题:1.USART3配置问题 2.接线问题USART3也是重映射到PC10 PC11这两个口的,所以要有GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);其实最主要的问题就是接线问题,即模块电压和MCU电压不一样。我的GSM模块_32板子上连接gsm模块的串口是哪个
文章浏览阅读124次。HTTP返回状态码1 HTTP超文本协议HTTP是基于客户端/服务端(C/S)的框架模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。一个HTTP“客户端”是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP请求的目的。一个HTTP“服务器”同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器..._nginx 请求头太大(nginx) nginx 内置代码和 431 类似。
文章浏览阅读576次。1./*Name:插入堆排序(A[0]为空情况)Coder:Lou JianghuiTime:22:49-23:07*/#include#include#includeusing namespace std;int A[1000];int n;void print(int n){ for (int i = 1;_堆排序的过程中,每次进行堆调整后,打印输出堆的次序
文章浏览阅读695次。1.概述HyperLogLog一个常用的场景就是统计网站的UV。##基数 简单来说,基数(cardinality,也译作势),是指一个集合(这里的集合允许存在重复元素)中不同元素的个数。例如看下面的集合: {1,2,3,4,5,2,3,9,7} 这个集合有9个元素,但是2和3各出现了两次,因此不重复的元素为1,2,3,4,5,9,7,所以这个集合的基数是7。maven <dependency> <groupId>net.agkn</grou._hyperloglog可以处理带重复元素的流数据吗
文章浏览阅读1.2w次,点赞3次,收藏8次。先展示下效果图:Navicat不能直接将注释展示在表模型上,需要曲线救国。展示表的中文名方法:选中画布上的一个表模型,然后在左侧的图表页签中将“显示描述”勾选中,表模型上方会自动出现一个描述框,选中描述框右键选择编辑,填写表的中文名即可。展示表字段对应的中文名的方法:选择左侧的新建笔记,然后右键选中笔记,选择样式为标签,对应表字段顺序输入中文名称,最后将标签调整到适当位置即可。标签的样式也可以通过左侧属性配置进行修改,比如间距,字体大小之类。..._navicat在表对象界面显示表的备注
文章浏览阅读141次。对于一个长度为N的整数数列A1A2⋯AN,小蓝想知道下标l到r的部分和il∑rAiAlAl1⋯Ar是多少?然而,小蓝并不知道数列中每个数的值是多少,他只知道它的M个部分和的值。其中第i个部分和是下标li到ri的部分和∑jliriAliAli1⋯Ari, 值是Si。_推导部分和 带权并查集 蓝桥
文章浏览阅读1.4k次。数据配置方式一般是三种:1.org.springframework.jdbc.datasource.DriverManagerDataSource(没有池概念,有连接就建立一个connection)2.org.apache.commons.dbcp.BasicDataSource(连接池技术)3.org.springframework.jndi.JndiObjectFactoryBea..._tomcat 数据库切换
文章浏览阅读1.7w次,点赞62次,收藏544次。第1章 计算机系统概述0、1编码第2章 存储系统磁盘存储器第6章 控制器逻辑Intel 8086 指令简介第1章 计算机系统概述0、1编码1、分别求出+1111B和-1001B的真值及其机器数的原码、反码、补码形式。答案:+1111B的真值:15原码01111 反码01111 补码01111-1001B 的真值:-9原码11001 反码10110 补码10111另一种写法:解: +1111B 真值:15D [x]原=01111B [x]反=01111B [x]补=011._计算机组成原理计算题
文章浏览阅读647次。[0.57]欢迎来到React Native版本的0.57版!这个版本解决了许多问题,并有一些令人兴奋的改进。我们再次跳过了一个月发布,通过扩展发布候选阶段关注质量,并且兼容之前的版本这个版本包括599提交由73个不同的贡献者!为了响应反馈,我们准备了一个只包含用户影响的更改的变更日志。请分享您的意见,并让我们知道我们如何使这更有用,如果您对此有任何反馈,和往常一样请告知我们let us kn..._react-native 0.57版本文档
文章浏览阅读4.6k次,点赞8次,收藏44次。IDEA Comment Eclipse Comment Remark Ctrl+Alt+H 调用层次 Ctrl+Alt+H 开放的调用层次结构 Ctrl+E 展示打开的文件(快速转换编辑器) Alt+7 当前文件结构 Ctrl+O 当前文件结构 Ctrl+H 查看Java类层次结构 Ctrl+....._eclipse的folder对应idea的哪个
文章浏览阅读2.1k次。最近因为一些操作,想将命名不规范的pycharm安装目录的空格删掉,但是删掉以后,发现pycharm怎么也打不开了。在将脑汁都绞尽以后,参考一篇博客,终于发现了问题所在https://blog.csdn.net/weixin_45696455/article/details/106414316在看了上面一篇博客后,谢谢哥,茅塞顿开,原来是我破解的.vmoption文件问题,里面写了破解包路径,一旦修改pycharm路径后,将无法找到该破解包。但当我在文件夹打开.vmoption文件以后,发现我并没有写破_为什么修改已安装的pycharm的安装路径会打不开软件
文章浏览阅读2.2w次,点赞7次,收藏29次。1.在NI官网下载VISA,上一篇文章中已经讲到,此处不再赘述。2.关到电脑的所有杀毒软件,非常重要。3.点击运行。4.一直点击next,在需要更改安装目录时,自己更改(最好不要安装在C盘)。5.安装结束后,在最新安装目录下查找NI-MAX。可以直接将他拖动到桌面即可。打开后查看设备与接口若发现里面含有内容,则安装成功,如下图所示。..._nivisa安装教程