这几天跟着b站上的老师进行了opencv最基础操作的学习,接下来写一下自己学习到的内容。
(这个是b站上学习的链接,有兴趣的话可以看一下)https://www.bilibili.com/video/BV1PV411774y?p=9&share_source=copy_web
这个是我用的照片
def cv_show(name,img):
cv2.imshow(name, img)
cv2.waitKey(0) # 0代表按任意键退出 其他数字代表等待多少毫秒
cv2.destroyAllWindows() # 销毁所有窗口
首先定义了一下函数方便之后显示图像(不用一遍遍的敲)
这里用的是imshow来展示的,如果是用print的话,会用矩阵分别输出该图片各个通道的值。比如下面这个例子。
img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) #灰色图 cv2.IMREAD_GRAYSCALE第二参数表示读取类型
print(img)
cv_show('img2', img)
用灰度图举例,它所得的结果为:(取值范围在0--255之间)
[[10 10 10 ... 13 13 13]
[10 10 10 ... 13 13 13]
[10 10 10 ... 13 13 13]
...
[14 7 6 ... 16 9 22]
[40 18 3 ... 15 30 52]
[63 28 0 ... 15 19 47]]
接下来是shape的运用,它显示的是图片高,宽,和有几个颜色通道
img = cv2.imread('cat.jpg')
print(img.shape) # h,w,c(几个颜色通道)
这是彩色图的运行结果: (296, 474, 3),这个是转化为灰度图的后的结果(296, 474)
保存图片:
# cv2.inwrite('名称',img) 保存
接下来是对图像的部分截取:
#截取部分图像数据
img=cv2.imread('cat.jpg')
cat=img[0:200,0:200] #坐标范围
cv_show('cat',cat)
这个是所得到的图像,我们选定的像素点是高:0-200,宽:0-200
对颜色通道的操作:
首先是对颜色通道的提取:
#颜色通道提取
b,g,r=cv2.split(img) #分离
print(b)
[[12 12 12 ... 11 11 11]
[12 12 12 ... 11 11 11]
[12 12 12 ... 11 11 11]
...
[14 7 6 ... 7 2 15]
[40 18 3 ... 6 23 45]
[63 28 0 ... 6 12 40]]
代码段下面是所得到的B通道的参数。
接着是对颜色通道的组合:
img=cv2.merge((b,g,r)) #组合
只保留单色通道的图像: B---0,G---1,R---2
#只保留R
cur_img =img.copy()
cur_img[:,:,0]=0 #B---0
cur_img[:,:,1]=0 #G---1
cv_show('R',cur_img)
#只保留B
cur_img =img.copy()
cur_img[:,:,1]=0 #G---1
cur_img[:,:,2]=0 #R---2
cv_show('B',cur_img)
#只保留R
cur_img =img.copy()
cur_img[:,:,0]=0 #B---0
cur_img[:,:,1]=0 #G---1
cv_show('R',cur_img)
我们来展示一下:这个是B通道的图像
对图像边界的填充:
#边界填充
top_size,bottom_size,left_size,right_size =(50,50,50,50) #指定上下左右的填充大小
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE) #复制法
我们这里用了复制法(复制最边缘像素)举例,还有以下这些方法:
#BORDER_REFLECT 反射法,对感兴趣的图像中的像素在两边进行复制 dcba|abcd|dcba
#BORDER_REFLECT_101 反射法,以最边缘像素为轴,对称 dcb|abcd|cba
#BORDER_WRAP 外包装法 abcd|abcd|abcd
#BORDER_CONSTANT 常量法
以上这些方法都是用cv2.copyMakeBorder这个去进行操作的
我们也可以的对矩阵中的数值进行运算:
img_cat = cv2.imread('cat.jpg')
img_cat2 = img_cat + 10
shape值相同的话两张图片也可以相加,超过255的话,得到的数值会对256取余。
cv2.add(img_cat,img_cat2)
#没越界的话取自身,越界的话取255
这行代码也是相加,区别在于如果相加之后得到的数字大于255,它的值就会显示255。
如果shape值不相同,可以先把他们的shape值转化为相同的,再进行运算操作:
#改变高和宽
img_dog = cv2.resize(img_dog,(474,296))
#shape输出的是高和宽,resize需要的是宽和高
我们这里需要注意一下。shape值是输出的是高和宽,resize所需要的是宽和高。
也可以将他们的宽和高成为按一定比列的形式:
res1 = cv2.resize(img,(0,0),fx=3,fy=1)
#高和宽成一定的比例
下面是两张图片进行融合:
img_cat = cv2.imread('cat.jpg')
img_dog = cv2.imread('dog.jpg')
res = cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
#所选的照片和每个照片所占的权重,最后的数字代表提升多少亮度
这是融合后的结果
最后要说的是对视频的操作:
vc =cv2.VideoCapture('cat.mp4') #对视频的截取
if vc.isOpened(): #检查是否能正确打开
open,frame = vc.read()
else:
open =False
while open:
ret,frame =vc.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #转化成黑白色?
cv2.imshow('result',gray)
if cv2.waitKey(10) & 0xFF ==27: #0xFF==27代表按退出键退出,waitKey表示等待多久退出
break
vc.release()
cv2.destroyAllWindows() #关闭所有窗口
if语句判断是否能够打开,如果不能打开,那么while语句中就直接终止,如果可以打开,我们这里是将视频转化为了黑白色,视频会按我们操作之后的进行播放,waitkey()中的数字代表等待多少秒之后关闭视频,0xFF==27是代表按esc键退出(可以根据按键的ASCII码值进行修改)。
以上就是本次博客的全部内容,有什么不对的地方欢迎大家的指正。