> 文章列表 > 图像基本操作

图像基本操作

图像基本操作

第一周学习笔记

1.图像基本操作

在计算机里面一张图片会被分成很多个小格,每一个小格,每一个小格又会继续分为小格子,这每一个小格叫做一个像素点,每一个值构成一个像素点,每一个值在0-255之间进行浮动,表示该点的亮度,0的亮度最低也就是黑块,255的亮度最高,也就是白块。一般来说,一个彩色图像有3个通道,分别是RGB也就是,其中R表示的是红色,G表示的是绿色,B表示的是蓝色。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTAmnmUU-1682246295159)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-19 093950.png)]

如图所示,对于所圈住的那一个像素点,有三个颜色通道,对于红色,绿色,蓝色都有不同的像素值,也就有不同的亮度,最后形成的彩色的图像,但是,一般对于黑白的图像来说,只有一个颜色通道。只需要表示它的亮度就行。

1.数据读取图像

在做数据读取图像的时候,要导入一个cv2包,

注意:在使用cv2库的时候,文件路径一定要使用全英文,不能有中文,一旦有中文,就会有各种莫名其妙的错误

1.读入一张图片

读入一张图片:cv2.imread(filepath,flags)

其中filepath表示的是图片的路径

flags表示的是读入的是什么图片

1)cv2.IMRMED_COLOR:默认参数,读入一张彩色图片。或者直接写1,也可以不用写,Python中会自动默认这张彩色图片的参数是1

2)cv2.IMREAD_GRAYSCALE:读入灰度图片,或者直接写0

1.读入一张rgb图像
import cv2
image1=cv2.imread("写入这张需要读取的图片的路径"1)#也可以直接不写,因为在培养在python中默认是1
print(image.shape)
#读取这张图像的像素点的矩阵大小#(500,100,3)
2.读入一张灰度图像
import cv2
image2=cv2.imread("写入这张图像的路径",0)#表示读入的是一张灰度图
print(image2.shape)#表示读取的图像的像素点的矩阵大小(500,100)

2.显示一张图片

cv2.image(“窗口的名字”,读入的需要显示的图像)

1.显示一张rgb图片
import cv2
image1=cv.imread("写入这张需要读入的图像的路径")
cv2.imshow("image1",image)#第一个参数image1是窗口的名字,第二个参数是要显示的图像
cv.waitKey(0)#这个是表示的是图片的等待的时间,如果不调用这行代码的话,窗口会一闪而过,看不见我要显示的图片,0表示的是任意键终止。如果不是0的话,里面的参数的单位是ms,如果是1000的话就会等待1s,然后1s之后就会终止。
2.显示一张灰度图片
import cv2
image2=cv.imread("写入这张要读取的图片的路径",0)
cv.imshow("image2",image2)
cv.waitKey(0)

3.保存图片

import cv2
image2=cv2.imread("写入这张要读取的图片的路径"0)#一张灰度图
cv2.imwrite("所读取的这张图像要保存的路径""保存要读入的哪一张图片")

4.灰度图和彩色图之间的互相转化

调用cv2中的cvtColor

img2=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)#灰度化,彩色图像转化为灰度图像
img3=cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)#彩色化,灰度图像转化为彩色图像
#第一个参数是要转化的所读入的图片,第二个是以什么样子的形式去转化
1)rgb图转化为灰度图
import cv2
image2=cv2.imread("写入需要读取图片的路径"1)#彩色图像
print(image2.shape)
image3=cv2.cvtColor(image2,cv2.COLOR_RGB2GRAY)
print(image3.shape)
cv2.imshow("图像显示的窗口","所读入的需要显示的图像")
cv.waitKey(0)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFfZLwn4-1682246295160)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-22 114110.png)]

转化后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1TcEGPUZ-1682246295160)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-22 114140.png)]

2)灰度图转化为rgb图
import cv2
image1=cv.imread("写入要读取的图片的文件路径",0)
print(image1.shape)#(h,w)(100,500)
image2=cv.cvtColor(image1,cv2.COLOR_GRAY2RGB)
print(image2.shape)#(100,500,3)
cv2.imshow("image2",image2)
cv2.waitKey(0)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhGzUGTo-1682246295161)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-22 115603.png)]

转化后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0dSw5EGI-1682246295161)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-22 115603.png)]

可以看见:转化成的彩色图和原图看起来一样还是灰度图呀,但是实际上,通过打印的形状确实已经把单通道的图片变成三通道的图片了,这是因为OpenCV就是把灰度图复制了三次,分别赋值给了R,G,B通道了。

5.图像缩放

cv2.resize(image,dsize)#图像的缩放,第一个参数是原始图像,第二个是需要调整的图像大小。
1.彩色图像缩放
import cv2
image1=cv2.imread("图像路径",1)
print(image1.shape)#(100,500,3)
image2=cv2.resize(image1,(200,300))#每一个颜色通道需要的像素点的大小
print(image2.shape)#(200,300,3)
cv2.imshow("image2",image2)
cv2.waitKey(0)
2.灰度图像缩放
import cv2
image1=cv2.imread("图像路径",0)#(300,200)
print(image1.shape)
image2=cv2.resize(image1,(200,100))
print(image2.shape)
cv2.imshow("image2",image2)
cv2.waitKey(0)

6.图像翻转

cv2.filp(img,filecode)

第一个参数指的是读入的需要翻转的图像名,第二个参数指的是如果翻转

filecode=0;沿着x轴翻转就是上下翻转

filecode>0;沿着y轴翻转就是左右翻转

filecode<0;x,y轴同时翻转,就是中心对称

import cv2
image2=cv2.imread("图像路径"1)
image3=cv2.filp(image2,0)#沿x轴翻转上下翻转
image4=cv2.filp(image2,1)#沿y轴翻转左右翻转
image5=cv2.filp(image2,-1)#沿x,y翻转,关于原点对称
cv2.imshow("image1",image2)
cv2.imshow("image2",image3)
cv2.imshow("image3",image4)
cv2.imshow("image4",image5)
cv2.waitKey(0)

2.数据读取视频

对于视频来说,视频实际上也是由一张张图片所组成的,视频是由一帧帧图片所构成的。

cv2读取视频的一般流程

1.获取视频 视频名字=cv2.VideoCapture()

VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是1,表示打开笔记本的外置摄像头。如果是其他数字的话就代表其他设备,参数如果是视频的文件路径的话就打开指定路径下的视频。

2.判断获取的视频是否打开正确,成功读取视频对象就放回True 视频名字.isOpened()返回的是一个布尔值

3.按帧读取ret,frame=视频名字.read()

4.展示图像cv2.waitKey(1)#表示每一帧即每一个图像展示1ms就终止,这个速度非常快了

import cv2
#读取视频
vc=cv2.VideoCapture("指定路径下的视频文件名")
#检查是否打开正确
if vc.isOpened():#返回Trueopen,frame=vc.read()#open=True
else:open=False#或者2(2)判断读的视频流是否是正确的
while vc.isOpened():#3.获取每帧图像ret,frame=vc.read()#如果所读的是视频是正确的那么就ret就是True,否则就是False,那么就是没有读取成功,其中frame是图像if ret:#成功获取图像cv2.imshow("窗口名字",需要显示的画面的名字)key=cv2.waitKey(25)#表示读取的每一帧停留25ms,停留25ms,然后再开始下一帧if key&0xFF==ord('q')break#当键入q的时候,就会退出while循环

3.ROL区域

ROL区域就是(region of interesting)表示可以选取自己喜欢的,想要的那个区域图像

1.截取部分图像数据

在平时我们会选择图片上的部分图像数据进行截取,所以我们通常

采用切片的方法截取部分图像有

def cv_show('显示图像的窗口名字(name)',需要显示的图像文件名(filename))cv2.imshow('name',filename)cv2.waitKey(0)cv2.destroyAllWindows()
img=cv2.imread("读取的图像的文件路径名"1)#读取一张彩色图像
img_1=img[0:50,0:200]#对读入的图像进行切片处理,获得部分图像,表示高是50个像素值点,宽度是200个像素值点,
cv_show('W_name',img_1)

截取之后

相比于之前,确实是截取了部分的图像,高为50个像素点,宽为200个像素点

2.颜色通道提取

img=cv2.imread("图像文件路径")
b,g,r=cv2.split(img)#在opencv中彩色图像的格式是RGB,然后将图像分裂开有prin
print(b.shape)#(414,500)#显示出每一个颜色通道的像素点大小
img1=cv2.merge((b,g,r))#将每一个单颜色通道合并
print(img1.shape)#(414,500,3)#打印出一个彩色图像的像素点矩阵大小

对于OpenCV中来说,在彩色图像中,如果我们要只保留一个颜色通道的时候,我们会对其他的颜色通道赋值为0,在OpenCV中,彩色图像的储存格式是BGR,B的图像的切片是[:,:,0],G的图像的切片是[:,:,1],R的图像的切片是[:,:,2]

#只保留R通道
img_c=img.copy()#将上面读取的img图像进行拷贝复制一份
img_c[:,:,0]=0#不要B通道
img_c[:,:,1]=0#不要G通道
cv_show('R',img_c)#调用上面的函数,将图片显示出来
#只保留G通道
img_c=img.copy()#将上面读取的img图像进行拷贝复制一份
img_c[:,:,0]=0#不要B通道
img_c[:,:,2]=0#不要R通道
cv_show('G',img_c)#调用上面的函数,将图片显示出来
#只保留B通道
img_c=img.copy()#将上面读取的img图像进行拷贝复制一份
img_c[:,:,2]=0#不要R通道
img_c[:,:,1]=0#不要G通道
cv_show('B',img_c)#调用上面的函数,将图片显示出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dteT46Ms-1682246295162)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-23 092548.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4QN3dQ7-1682246295164)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-23 092604.png)]

4.边界填充

opencv-图像边界填充

基本语法

cv2.copyMakeBorder(img,top,bottom,left,right,borderType)#参数解释
#1.img:需要填充的图像
#2.top:图像上边界需要填充的像素点
#3.bottom:图像下边界需要填充的像素点
#4.left:图像左边界需要填充的像素点
#5.right:图像右边界需要填充的像素点
#6.borderType:图像填充的方法。
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法abcdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充,需要在设置一个value值,已显示填充的颜色,如果value=0的时候,那么需要填充的就是黑色
#边界填充
#cv2.copyMakeBorder(img,top, bottom, left, right ,borderType) top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REPLICATE)#复制法
reflect = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT)#反射法            fedcba|abcdefgh|hgfedcb
reflect_101 = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT_101)#反射法              gfedcb|abcdefgh|gfedcba
wrap = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_WRAP)#外包装法 abcdefgh|abcdefgh|abcdefg
constant = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_CONSTANT,value=0)#边界填充的是黑色

5.基本数值计算

import cv2
import numpy as np
import matplotlib.pyplot.plt as plt
img_cat=cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')
plt.imshow(img_cat)
plt.imshow(img_dog)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdpmaIoF-1682246295165)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-23 143345.png)]

img_cat2=img_cat+10#对每一个图像的像素点进行数值上的加10,但是图像的矩阵大小不变
img_cat[:5,:,0]#只展示一个颜色通道,已经部分像素点(5行)
img_cat.shape#(5,300)
img_cat2.shape#(5,300)
(img_cat+img_cat2)[:5,:,0]#对应的像素点依次直接相加,相当于对于每一个像素点都%256
#但是在OpenCV中,有
cv2.add(img_cat,img_cat2)[:5,:,0]
#如果这两个像素点相加之后的值超过了255,那么就返回255

再说resize()

result0=cv2.resize(img_cat,(0,0),fx=3,fy=1)#表示这张图片的宽度是高度的3倍
result1=cv2.resize(img_cat,(0,0),fx=1,fy=3)#表示这张图片的高度是宽度的3倍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SosbOcG-1682246295165)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-23 150554.png)]

图像融合

#图像的融合,就是把两张图片进行融合,但是能够对此融合的前提是图片的像素点分布是一样的
print(img_cat.shape)#(414,500,3)
print(img_dog.shape)#(429,499,3)
#这样看来是不能融合在一起的,所以要对其中任意一个图像进行图像的缩放调整,使得这两个图片的像素点的分布是一样的
#1.对图像进行调整
img_dog=cv2.resize(img_dog,(414,500))
print(img_dog.shape)#(414,500)
#2.图像的融合
调用语法addWeighted(scr1,alpha,src2,beta,gamma)#src1, src2:需要融合相加的两副大小和通道数相等的图像#alpha:src1的权重#beta:src2的权重#gamma:gamma修正系数,不需要修正设置为0,
#两副图像的权重alpha和beta取值没有强制要求,但一般情况建议alpha+beta=1。实际上alpha、beta和src1、src2相乘就是调整的src1、src2对应图像的明暗度
result=cv2.addWeighted(img_dog,0.4,img_cat,0.6,0)
plt.imshow(result)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4GYPkQ1-1682246295166)(C:\\Users\\86185\\Desktop\\屏幕截图 2023-04-23 150132.png)]

下次计划:预计下一周会对Python中的Numpy和Pandas的数据科学计算,以及Matplotlib绘图方面进行初阶的学习
lpha:src1的权重
#beta:src2的权重
#gamma:gamma修正系数,不需要修正设置为0,
#两副图像的权重alpha和beta取值没有强制要求,但一般情况建议alpha+beta=1。实际上alpha、beta和src1、src2相乘就是调整的src1、src2对应图像的明暗度
result=cv2.addWeighted(img_dog,0.4,img_cat,0.6,0)
plt.imshow(result)


[外链图片转存中...(img-L4GYPkQ1-1682246295166)]下次计划:预计下一周会对Python中的Numpy和Pandas的数据科学计算,以及Matplotlib绘图方面进行初阶的学习