一、安装&问题
Pycharm中File->setting->Python Interpreter添加opencv-python及opencv-contrib-python,调用时直接import cv2
即可。
我原来用的Pycharm版本是2018年的,点了更新之后注销快捷键Ctrl+/
用不了了,解决方法是:File->Setting->Keymap,更改这个为自己的系统,比如我以前用的是Windows。
二、题目&代码
题目:使用opencv进行图像处理
描述:自行下载一张网络图片以.jpg格式保存(要求宽高均大于448);自行安装opencv(cv2)以及opencv-contrib;使用opencv读取.jpg格式的文件,并获取图片的宽、高信息;将img1进行镜像,且进行灰度处理得到img2,镜像轴为y轴;Img2进行中心裁剪,裁剪得到448*448的新图片img3;将img1与img2、img3打印出来,并将img2和img3保存到本地文件中。输入:本地读取图像img1;输出:打印img1、img2、img3将img2、img3保存在本地文件中。
import cv2
import numpy as np
def Image():
# flags False显示灰度图像,True显示原图
img1 = cv2.imread("C:\\Users\\*\\Pictures\\img1.jpg") # 镜玄yyds啊啊啊啊啊!
cv2.imshow(winname='img1',mat=img1)
cv2.waitKey(2000)
# cv2.namedWindow('img1',cv2.WINDOW_NORMAL)
# 获取图片信息,输出高宽通道数
height = img1.shape[0]
width = img1.shape[1]
print('该图像宽为:',width)
print('该图像高为:',height)
# 将img1进行水平镜像翻转(对称轴为y轴)
# 图像的镜像翻转得到的图像与原图像构成的图像是一个轴对称图像
img2 = cv2.flip(img1,1) # 0 垂直镜像翻转,1 水平镜像翻转,-1 对角镜像反转
# 灰度处理img2 令R=G=B
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
cv2.imshow(winname='img2',mat=img2)
cv2.waitKey(2000)
img3 = img2[int(height/2-224):int(height/2+224), int(width/2-224):int(width/2+224)] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imshow('img3',img3)
cv2.imshow(winname='img3',mat=img3)
cv2.waitKey(2000)
# 打印图像矩阵
print(img1,img2,img3)
# # 多图同窗显示,要求图像通道大小必须相同
# imgs = np.hstack((img1,img2,img3))
imgs = ManyImgs(0.2,([img1,img2,img3])) # 结果伸缩变形,需要调整
cv2.imshow('imgs',imgs)
cv2.waitKey(1000)
# 等待关闭
# cv2.destroyWindow()
# 调用函数
cv2.imwrite('C:\\Users\\*\\Pictures\\img2.jpg',img2)
cv2.imwrite('C:\\Users\\*\\Pictures\\img3.jpg',img3)
# 参考博文:《Opencv实现多幅图像显示在同一窗口(基于Python)》
# 链接:https://blog.csdn.net/qq_44703724/article/details/105613611?
# 定义函数,第一个参数是缩放比例,第二个参数是需要显示的图片组成的元组或者列表
def ManyImgs(scale, imgarray):
rows = len(imgarray) # 元组或者列表的长度
cols = len(imgarray[0]) # 如果imgarray是列表,返回列表里第一幅图像的通道数,如果是元组,返回元组里包含的第一个列表的长度
# print("rows=", rows, "cols=", cols)
# 判断imgarray[0]的类型是否是list
# 是list,表明imgarray是一个元组,需要垂直显示
rowsAvailable = isinstance(imgarray[0], list)
# 第一张图片的宽高
width = imgarray[0][0].shape[1]
height = imgarray[0][0].shape[0]
# print("width=", width, "height=", height)
# 如果传入的是一个元组
if rowsAvailable:
for x in range(0, rows):
for y in range(0, cols):
# 遍历元组,如果是第一幅图像,不做变换
if imgarray[x][y].shape[:2] == imgarray[0][0].shape[:2]:
imgarray[x][y] = cv2.resize(imgarray[x][y], (0, 0), None, scale, scale)
# 将其他矩阵变换为与第一幅图像相同大小,缩放比例为scale
else:
imgarray[x][y] = cv2.resize(imgarray[x][y], (imgarray[0][0].shape[1], imgarray[0][0].shape[0]), None, scale, scale)
# # 如果图像是灰度图,将其转换成彩色显示
# if len(imgarray[x][y].shape) == 2:
# imgarray[x][y] = cv2.cvtColor(imgarray[x][y], cv2.COLOR_GRAY2BGR)
# 创建一个空白画布,与第一张图片大小相同
imgBlank = np.zeros((height, width, 3), np.uint8)
hor = [imgBlank] * rows # 与第一张图片大小相同,与元组包含列表数相同的水平空白图像
for x in range(0, rows):
# 将元组里第x个列表水平排列
hor[x] = np.hstack(imgarray[x])
ver = np.vstack(hor) # 将不同列表垂直拼接
# 如果传入的是一个列表
else:
# 变换操作,与前面相同
for x in range(0, rows):
if imgarray[x].shape[:2] == imgarray[0].shape[:2]:
imgarray[x] = cv2.resize(imgarray[x], (0, 0), None, scale, scale)
else:
imgarray[x] = cv2.resize(imgarray[x], (imgarray[0].shape[1], imgarray[0].shape[0]), None, scale, scale)
if len(imgarray[x].shape) == 2:
imgarray[x] = cv2.cvtColor(imgarray[x], cv2.COLOR_GRAY2BGR)
# 将列表水平排列
hor = np.hstack(imgarray)
ver = hor
return ver
if __name__=='__main__':
Image()
三、结果
镜玄yyds!!!眷思量我等着你更新!!!
img1.jpg
宽高及打印
img2.jpg
img3.jpg
利用ManyImgs()函数得到的图像有伸缩变形,需要修正。