Python计算机视觉(一)

前期工作

这里的前期工作比较简略。因为基于已经成功安装了pycharm和anaconda等相关工具,并且有一定的工具使用基础。

库安装

这里建议使用Anaconda创建虚拟环境,然后在虚拟环境里面进行安装库

pip install opencv-python
pip install opencv-contrib-python    

jupyter notebook

Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。
这里安装Jupyter Notebook使得我们可以进行交互式编程,从而对中间结果进行更好的可视化呈现。

pip install jupyter
#可以通过jupyter notebook进入
#终端输入
jupyter notebook
#安装自动补全插件
pip install jupyter_contrib_nbextensions

jupyter安装参考网站
jupyter notebook操作手册

图像基本操作

0-255表示一个像素点,矩阵代表大小,行*列=总像素点个数。然后黑白图由一个通道组成,彩色图像由三个通道,RGB组成。

图像的读取

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
#cv2不能读取中文路径,最好采用相对路径
#opencv读取的格式是BGR
img = cv2.imread("cvimage.png")
#灰度读取
img1 = cv2.imread("cvimage.png",cv2.IMREAD_GRAYSCALE)

图像的显示与保存

cv2.imshow('image',img)#img对应上文读取的
#等待时间,0表示按任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
#图像保存
cv2.imwrite('image.png',img)
#封装函数
def cv_show(name,img):
	cv2.imshow(name,img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()

视频读取

vc = cv2.VideoCapture("test.mp4")
if vc.isOpened():
    open,frame = vc.read()
else:
    open = False
frame.shape

灰度图像展示

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)
        #正常速度1秒30帧,所以33秒比较合适,然后0XFF是表示按任意键退出
        if cv2.waitKey(33) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

截取部分图像数据

img = cv2.imread("image.png")
#截取其中的一部分图像
cat = img[0:50,0:200]
#这个是前面的封装函数
cv_show("image",cat)

颜色通道提取

#cv2里面彩色图片的通道顺序是b,g,r
b,g,r = cv2.split(img)
#上面是拆分通道,下面是组合通道
img_1 = cv2.merge((b,g,r))
cv_show("imgae",img_1)

b,g,r颜色分析

#只保留B
B_img = img.copy()
B_img[:,:,1] = 0
B_img[:,:,2] = 0
cv_show('B',B_img)
#只保留G
G_img = img.copy()
G_img[:,:,0] = 0
G_img[:,:,2] = 0
cv_show('G',G_img)
#只保留R
R_img = img.copy()
R_img[:,:,0] = 0
R_img[:,:,1] = 0
cv_show('R',R_img)

因此可以得到B是蓝色通道,而G是绿色通道,R是红色通道

边界填充

#定义边界值
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)
#反射法,对称复制,daad类似
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
#反射法 对称复制,但不重复对称轴
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT_101)
#外包装法,多重复制
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_WRAP)
#常量法,常量填充
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_CONSTANT,value = 0)
import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGINAI')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')

使用cv2.imread()读取图像时,默认彩色图像的三通道顺序为B、G、R,这与我们所熟知的RGB中的R通道和B通道正好互换位置了。而使用plt.imshow()函数却默认显示图像的通道顺序为R、G、B,导致图像出现色差发蓝。可以使用互换方式然后使得重新为R,G,B方式。

b,g,r = cv2.split(img)
img = cv2.merge((r,g,b))

数值计算

img_one = cv2.imread("image.png")
img_two = cv2.imread("image.png")
img_one = img_one+10
img_one[:5,:,0]
cv_show("",img_one)
#相当于mod256,因为uint8最多到255
img_three = (img_one+img_two)
cv_show("",(img_one+img_two))
#这里的相加到了超过255,只会记作255
img_four = cv2.add(img_one,img_two)
#相减同样的最多到0
img_five = cv2.subtract(img_one,img_two)
cv_show("",img_four)
cv_show("",img_five)

图像融合

#shape值不同没有办法执行相加相减操作
img_one = cv2.imread('one.png')
img_two = cv2.imread("two.png")
print(img_one.shape,img_two.shape)
#两个的shape值不相同,因此需要进行转化
#resize也可使用倍数(img,(0,0),fx=x,fy=x)
img_two = cv2.resize(img_two,(1200,800))
img_two.shape
res = cv2.addWeighted(img_one,0.4,img_two,0.6,0)
plt.imshow(res)

附上最后我使用的图片、在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值