如何使用opencv-pyhon编辑图片(一)
因为最近在使用YOLO模型,需要对采集到的高分辨率图片数据进行一系列的处理以适应模型的输入,所以需要对采集到的图片进行预处理,这个过程需要用到opencv-pyhon,所以打算整理一下简单的使用过程。参考了以下博客,感谢博主蛋片鸡()
1.确认环境(读取显示单张图片)
在python环境的基础上,使用opencv-pyhon需要保证几个基本的库已经安装:wheel,numpy,opencv-pyhon(建议大家安装anaconda作为自己python环境的管理,非常方便)。
首先,运行一下一段代码测试自己的库函数是否正确安装:
import cv2
import numpy as np
img = cv2.imread(r'cat.jpg') #空格内为读取图片所在的路径
cv2.imshow("Title",img) #其中Title为窗口标题显示内容,img为之前路径读取的图片
cv2.waitKey(0) #cv2.waitKey(parameter),parameter = NONE & 0表示一直显示,除此之外表示显示的毫秒数
cv2.destroyAllWindows() #将所有的窗口销毁
如果代码正常运行,会得到类似如下所示的显示:
环境搭建完成,可以进行其他的操作了。
2.opencv图片打印,图片另存为
还是直接上代码吧,个人记性也不好,所以给一段标准代码,然后详细注解:
import cv2
import numpy as np
#输出图片属性
def get_image_info(image):
print(type(image)) #打印图片类型(如np数据矩阵等)
print(image.shape) #打印图片形状(x,x,x)
print(image.size) #打印图片大小(结果为shape相乘)
print(image.dtype) #打印图像类型(如uint8等)
pixel_data=np.array(image) #将像素数据转换为np矩阵
print(pixel_data) #将np图片矩阵打印出来
#网上参考了几个类似的博客,借鉴了大家的做法写了这个get_image_info的小函数做解析
img = cv2.imread(r'C:\Users\skiery\Desktop\cat.jpg')
cv2.imshow('Cat',img)
get_image_info(img)
cv2.imwrite(r'C:\Users\skiery\Desktop\catt.jpg') #将图片储存在该路径下
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #将图片转化为灰度图片
cv2.imwrite(r'C:\Users\skiery\Desktop\cat_gray.jpg',gray) #储存灰度图片
cv2.waitKey(0)
cv2.destroyAllWindows()
生成的灰度图片如下所示:
3.电脑摄像头的调取和显示
代码如下:
#电脑摄像头的调用
import cv2
def video_demo():
capture = cv.VideoCapture(0) #参数为视频设备ID,如果为但摄像头电脑则表示打开默认摄像头,也可以填写视频文件路径
while True:
ret,frame = capture.read()
#read函数读取视频或来自摄像头的帧,可以返回两个参数,其一是bool类型的值ret,表示是否读取到图片,第二个参数为frame,为当前所截取的帧
frame = cv2.flip(frame,1)
#翻转 0:为沿x轴翻转,大于0:沿Y轴翻转,小于0:先沿x轴翻转,再沿Y轴翻转,类型中心对称旋转180度
cv2.imshow('Video_now',frame)
pc = cv2.waitKey(10) #超过10毫秒时,waitKey函数返回-1,若10ms内按了键盘,则返回该按键的asicc码,一定为大于0的数
if pc>0:
break
#设置一个推出的标记,也可以改为其他按键
video_demo()
cv2.destroyAllWindows()
正常运行可以打开摄像头,观测到摄像头内的视频流数据,如下所示:
因而成功读取了视频流数据。
4.使用对图片进行缩放操作
#读取一张图片
import cv2
img = cv2.imread(r'C:\Users\1\Desktop\cat.jpg')
#直接对原图resize
new_img = cv2.resize(img,(416,416),interpolation = cv2.INTER_AREA)
cv2.imwrite(r'C:\Users\1\Desktop\cat1.jpg',new_img)
#按比例剪切原图后resize
flag = min(img.shape[0],img.shape[1])
new_img2 = img[((img.shape[0]-flag)//2):((img.shape[0]+flag)//2),((img.shape[1]-flag)//2):((img.shape[1]+flag)//2)]
new_img2 = cv2.resize(new_img2,(416,416),interpolation = cv2.INTER_AREA)# OpenCV推荐:如果要缩小图像,通常推荐使用#INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。至于最近邻插值INTER_NEAREST,一般不推荐使用
cv2.imwrite(r'C:\Users\1\Desktop\cat2.jpg',new_img2)
对比上述三幅图,效果如下:
原图:
直接resize:
按比例裁剪之后再缩放: