基于Python的Opencv学习

基于Python的Opencv学习第三天

各位小伙伴们大家好,今天是我学习Opencv的第三天,从第一篇博客开始到现在是第三篇博客了,介绍的都是比较基础的,我个人感觉就是因为比较基础我才给记录下来,因为基础的函数或者概念我们才用的最多,好啦,话不多说,继续学习吧!!!

一.使用numpy包来访问像素

在之前我的博客里面是在import cv2里面直接读取像素然后对像素进行处理的,今天我们学一个不一样的,就是使用numpy包来访问像素。

1.读取像素
在这里用numpy包读取像素的方法和直接读取像素不同,我们需要用item()函数来读取像素。具体使用方法如下:

返回值=图像.item(位置参数)

对于两种图像(灰度图和彩色图)有两种不同的返回值。

灰度图 返回灰度值
彩色图 返回值为B,G,R的值

示例:
灰度图 p=img.item(88,142)
彩色图 blue=img.item(78,125,0)
green=img.item(78,125,1)
red=img.item(78,125,2)

在这里,img为我定义的图像的名称,然后调用了item()函数,在灰度图里面,两个数据直接是像素坐标,彩色图里面多了第三个是通道的值(至于像素坐标和通道,如果有不理解的小伙伴,可以看我前两篇博客来了解一下)。

2.修改像素

修改像素我们需要用到itemset()函数,具体使用语法如下:

图像名.itemset((位置x坐标,位置y坐标),新值)

来看示例:
灰度图 img.itemset((88,99),255)
彩色图 img.itemset((88,99,0),255)

在这里我就不过多赘述,看语法和示例就能明白每个数字含义。

>>> import cv2
>>> import numpy as np
>>> i=cv2.imread(r"C:\Users\LT010407\Desktop\0.jpg")
>>> print(i.item(100,100,1))
30
>>> i.itemset((100,100,1),255)
>>> print(i.item(100,100,1))
255
>>> 

在这里插入图片描述
在这里我在idle上面运行了代码,小伙伴们可以看到结果已经很好的展示在了我们的idle上面。

刚刚介绍了用numpy包来对像素进行操作,感觉还是在介绍老的知识点,小伙伴们别着急,现在我立马介绍一个新的东西,肯定能够让你们产生兴趣。

二.图像ROI

1.图像ROI是什么
ROI中文是感兴趣区域,指从被处理的图像以方框,圆,椭圆,不规则多边形等方式勾勒出需要处理的区域,可以通过各种算子和函数来求得感兴趣区域ROI,并进行图像的下一步处理。文字还是表达不清楚,还是用代码来解释一下可能更容易理解。

import cv2
img=cv2.imread(“图像名称”)
face=img[200:400,200:400]

在这里插入图片描述

如上图,黄色的是我们调用的那张图像,蓝色的范围(坐标已经给出)是指我们感兴趣区域(即ROI),再结合代码就能明白,我们取出感兴趣区域的图像(蓝色区域)赋给了face。
我相信这么一说大家更能够理解什么是ROI了吧。

2.图像ROI的语法
至于语法,在刚刚介绍中我好像全给说完了,哈哈哈。这样吧,直接上代码吧,就能够看的更明白。

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\1.jpg")
>>> face=img[200:400,200:400]
>>> cv2.imshow("picture1",img)
>>> cv2.imshow("face",face)
>>> 

在这里插入图片描述
这里是我们的代码,小伙伴们可以先思考一下会发生什么情况。

铛铛铛,我们来揭晓结果把。
在这里插入图片描述
这个是我命名的picture1的图像,一张很好看的风景图。
在这里插入图片描述
这个是我命名face的一张图像,取自那个picture1图像的200到400行和200到400列的所有像素点组成的图像,这下小伙伴们明白了图像ROI的语法了吧。

可能有小伙伴会问,我都取出来了一块图像,那我能不能给这个图像加在原图的任意位置呢,答案是肯定可以的,而且我们不仅仅可以给这个感兴趣区域的图像取出来放到原图里面去,还可以给这张图像放到任何一张图像里面,大家请往下看。
在这里我们可以直接进行图像ROI的选取,然后直接进行赋右值就可以改变图像。先来看代码。

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> pic=cv2.imread(r"C:\Users\LT010407\Desktop\3.jpg")
>>> face=img[100:200,100:200]
>>> pic[150:250,120:220]=face
>>> img[0:100,0:100]=face
>>>> cv2.imshow("img",img)
>>> cv2.imshow("pic",pic)
>>> 

在这里插入图片描述
在这里插入图片描述
在这里我们可以看到,我分别截取了那个皮卡丘的眼睛然后先在皮卡丘那张图片上复制到0:100行和0:100列,然后在第二幅风景图纸150:250行和120:220列又再次进行复制。
其实大家看到这儿,估计对我们的这个图像ROI已经有了充分的认识了,通俗一点来说就是先截取一段图片,然后我们可以给这段图片随意指定位置或者直接在一个新窗口弹出,可以类别计算机里面的copy和paste来理解。

三.通道的拆分与合并

1.通道的拆分
我们再来介绍一下,关于彩色图通道的拆分。通道的拆分意味着什么呢,首先,我们知道彩色图是由B,G,R三个通道所构成的,那么我们可以给这三个通道独立出来就是拆分的过程。如果我们直接使用opencv来进行拆分,那么可以用以下语法完成:

img=cv2.imread(“图像名”)
b=img[ : , : ,0]
g=img[ : , : ,1]
r=img[ : , : ,2]

但是在opencv里面有专门用来进行通道拆分的split()函数,来看一下语法:

一次性拆分:
img=cv2.imread(“图像名”)
b,g,r=cv2.split(img)
将三个通道拆分出来后可以得到三个灰度图像
来看一下代码和结果:

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b,g,r=cv2.split(img)
>>> cv2.imshow("B",b)
>>> cv2.imshow("G",g)
>>> cv2.imshow("R",r)
>>> 

在这里插入图片描述
大家可以看到我现在已经给三个通道拆分了出来,分别得到三个不同的灰度图像,这就是一次性拆分三个通道的代码和结果展示。

除了一次性拆分还可以每次只得到一个通道来拆分,这里就可以在split()函数后面加一个下标就可以实现:

img=cv2.imread(“图像地址”)
b=cv2.split(img)[0]
g=cv2.split(img)[1]
r=cv2.split(img)[2]

如果只需要一个通道的图像,那我们就不需要写其他通道的代码,至于代码和实现结果和一次性拆分相似,这里我就不赘述了。

2.通道的合并
有拆分肯定得给合并起来,这里我们就用到merge()函数,具体语法如下:

img=cv2.imread(“图像地址”)
b,g,r=cv2.split(img)
bgr=cv2.merge([b,g,r])

在这里我们需要注意合并的顺序,即[b,g,r]的顺序,如果是写反了[r,g,b]的顺序的话,就无法得到我们想要的图像。

来看代码和结果展示:

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b,g,r=cv2.split(img)
>>> cv2.imshow("B",b)
>>> cv2.imshow("G",g)
>>> cv2.imshow("R",r)
>>> bgr=cv2.merge([b,g,r])
>>> rgb=cv2.merge([r,g,b])
>>> cv2.imshow("bgr",bgr)
>>> cv2.imshow("rgb",rgb)
>>> 

在这里插入图片描述
这个我们可以看到,如果我们合并的顺序正确,那么我们能够得到一只非常可爱的皮卡丘,但是如果合并顺序出错,那么这个皮卡丘就变颜色了,也并不是我们想要的结果。

接下来我想再介绍一下拿任意一个通道与两个等大的空白通道合并,来看看效果吧

>>> import cv2
>>> import numpy as np
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> rows,cols,chn=a.shape
>>> b=cv2.split(a)[0]
>>> g=np.zeros((rows,cols),a.dtype)
>>> r=np.zeros((rows,cols),a.dtype)
>>> m=cv2.merge([b,g,r])
>>> cv2.imshow("merge",m)
>>> 

这里我想介绍一下zeros()函数,用法如下:
zeros(shape,dtype=float,order=‘C’)
返回值是得到一个给定形状和类型的用0填充的数组
参数分析如下:
①shape:即该数组形状(几乘几的矩阵)
②dtype:数据类型,有多种可选参数,默认numpy.float64
(此处为了和原图像参数保持一致,就直接用了a.dtype)
③order:可选参数,C代表与c语言类似,行优先;F代表列优先
在这里插入图片描述
这个是结果,显示的是一大片蓝色 ,如果不是只用蓝色通道,而只是分别用其他两种颜色通道,得到的结果就是绿色和红色,这里就不再赘述。

好啦,今天讲了很多了,我觉得有重要的地方,也有一些基础的,当然总的来看,这还是基础中的基础,小伙伴们就先看看吧,毕竟我也是刚刚入门。大家共同进步吧!!!(转载注明出处)

车牌识别系统是计算机视觉领域的一个重要应用,可以在交通管理、安防等领域发挥重要作用。基于PythonOpenCV的车牌识别系统可以通过以下步骤实现: 1. 图像预处理:对原始图像进行二值化、去噪等处理,以便后续处理。 2. 车牌定位:使用基于边缘检测的方法或基于颜色的方法定位车牌位置。 3. 车牌字符分割:对车牌进行字符分割,可以使用基于投影的方法或基于轮廓的方法。 4. 字符识别:使用OCR技术对字符进行识别,可以使用深度学习模型或传统机器学习算法。 以下是一个简单的基于PythonOpenCV的车牌识别系统的示例代码: ```python import cv2 # 读取图像 img = cv2.imread('car.jpg') # 图像预处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 车牌定位 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] area = cv2.contourArea(cnt) if area < 1000 or area > 5000: continue rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(img, [box], 0, (0, 0, 255), 2) # 车牌字符分割 gray_roi = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) x, y, w, h = cv2.boundingRect(contours[0]) roi = gray_roi[y:y + h, x:x + w] ret, th = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) cv2.imshow('th', th) # 字符识别 model = load_model('model.h5') chars = [] contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] x, y, w, h = cv2.boundingRect(cnt) if w < 8 or h < 8: continue roi = th[y:y + h, x:x + w] roi = cv2.resize(roi, (20, 20)) roi = np.expand_dims(roi, axis=2) roi = np.expand_dims(roi, axis=0) pred = model.predict(roi) char = np.argmax(pred) chars.append(char) # 输出识别结果 result = ''.join([CHARS[i] for i in chars]) print(result) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 需要注意的是,以上代码只是一个简单的示例,实际的车牌识别系统需要针对具体场景进行优化和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值