基本的案例绘图与显示
一、理论分析
我们这里主要应用opencv-python这个包,对各种图像进行处理。是一个计算机视觉和机器学习的开发库,里面也集成了大量的API。在图像处理方面应用也十分广泛。我们着重根据这个库,对各种图像进行处理。
二、代码分析
首先的首先,我们需要安装一个opencv这个包,这个操作也十分的简单。步骤如下:
- 按住键盘的WIN+R键,打开运行框
- 输入cmd,点击确定,打开一个小黑框
- 输入pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/(后面-i + 链接时用的清华源,下载速度更快)
- 如果问你yes/no 输入y即可。过一小会安装完毕。、
- 题外话:其实不光是opencv-python,python的很多包都可以这样安装,比如pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/等等。
安装以后我们打开pycharm,这个环境配置也相对简单,讲起来也比较啰嗦。这里不再赘述。如果有问题的小伙伴,可自行百度。大家注意每一步要细心,不要学AL,刚入门,就从安装这里放弃了,哈哈。
输入代码 impor cv2,运行。发现,没有报错。那么恭喜你,安装成功了。哈哈。接下来,小程序员附上一个一组图片,用于案例展示,附上链接,大家自行食用。链接:https://pan.baidu.com/s/1TVIOEPh4wkEIbVHANLX5_A
提取码:cjfe。
2.1 展示图片基础
有了安装包和图片,下面当然就是愉快的展示图片啦。冲冲冲!这里首先建议在pycharm里新建一个项目,项目中可以存放我们需要的代码,同时在代码的同一目录下放入我们的图片文件,这样写读写路径十分的方便。
from cv2 import cv2 as cv #这样写,写代码会有代码提示
import numpy as np
img = cv.imread(r"CV-Pictures/015.jpg")
#读取图片路径,读者也可以写绝对路径,顾名思义,就是找到这幅图片的路径,粘贴进去。以防外一的话可以在路径前加入r。
#img = cv.imread(r"CV-Pictures/015.jpg",0)
#读取单通道,读取一张灰度图
cv.namedWindow("img",cv.WINDOW_NORMAL)
#使得窗口可以自由放大缩小
cv.imshow("img",img)
#展示图片
cv.waitKey(0)
#等待一个输入键盘的信号。一直展示图片。如果输入一个数字n的话,可以让它停留n毫秒。
cv.destroyAllWindows()
#您可以调用destroyWindow()或destroyAllWindows()来关闭窗口并取消分配任何相关的内存使用。对于一个简单的程序,实际上不必调用这些函数,因为退出时操作系统会自动关闭应用程序的所有资源和窗口
运行结果如图,这也算是最简单的图像展示了。
我们可以把imread读入图片后返回的对象img返回,你会看到。是个三维矩阵。输入图像的类型type<class ‘numpy.ndarray’>,shape是(1035, 690, 3)
那么看到上面的imshow函数,你不仅不会想到plt的show函数。但这里其实是有不同的。
import matplotlib.pyplot as plt
img = plt.imread("CV-Pictures/015.jpg")
plt.imshow(img)
plt.show()
代码运行结果
我们尝试用两种库的同一个方法读取图片,代码如下
from cv2 import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img0 = plt.imread(r'CV-Pictures\003.jpg')
img1 = cv.imread(r'CV-Pictures\003.jpg')
pic = np.hstack([img0,img1])
plt.imshow(pic)
plt.xticks([]) #去掉x轴
plt.yticks([]) #去掉y轴
plt.show()
代码运行结果
这里我们看到图片的形状相容,但是颜色不同,其原因是因为plt读取文件按照的存储时RGB格式,即绿红蓝三通道。而opencv读取文件存储时BGR格式。这样显示出的图片导致了不同。
2.2 绘制图片基础
from cv2 import cv2 as cv
import numpy as np
img = np.zeros((500,500,3),dtype=np.uint8)
cv.line(img,(50,50),(300,350),(255,255,0),3)
# cv.circle(img,(250,250),90,(0,0,255),3) #空心圆
cv.circle(img,(250,250),90,(0,0,255),-1) #填充 圆
cv.rectangle(img,(10,400),(100,480),(255,0,0),3) #矩形
# cv.ellipse(img,(300,400),(150,80),0,0,360,(0,255,255),3)#椭圆
# cv.ellipse(img,(300,400),(150,80),50,0,360,(0,255,255),3) #顺时针旋转50
# cv.ellipse(img,(300,400),(150,80),-30,0,360,(0,255,255),3)#逆时针旋转30
# cv.ellipse(img,(300,400),(150,80),-30,60,300,(0,255,255),-1)#展示部分椭圆
cv.putText(img,'Deep Learning',[10,380],cv.FONT_ITALIC,1.5,(0,0,255)) #FONT_ITALIC代表字体
cv.imshow('pic',img)
cv.waitKey(0)
cv.destroyAllWindows()
代码运行结果:
2.3 交互式绘图基础
2.3.1 双击在窗口画圆
from cv2 import cv2 as cv
import numpy as np
def draw_circle(event,x,y,flags,param): #画圆的函数
if event == cv.EVENT_LBUTTONDBLCLK: #输入事件等于双击鼠标左键
cv.circle(img,(x,y),60,(0,0,255),-1) #以点击点为中心,画圆
img = np.zeros((500,500,3),dtype=np.uint8) #构建绘画的黑板
cv.namedWindow('image') #对窗口命名
cv.setMouseCallback('image',draw_circle) #导入鼠标案件函数
while(1):
cv.imshow("image",img)
if(cv.waitKey(1)&0xFF == ord('q')): #输入q键结束交互
break
# cv.waitKey(0)
# cv.imshow("image",img)
cv.destroyAllWindows()
运行结果如图
2.3.2 在窗口绘图写字
from cv2 import cv2
import numpy as np
drawing=False
mode=True
ix,iy=-1,-1
def call_back_draw(event,x,y,flags,param):
global drawing,mode,ix,iy
if event==cv2.EVENT_LBUTTONDOWN:#鼠标左键按下,开始画图
drawing=True
ix,iy=x,y #读取按键坐标的绘图
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
if drawing==True:
if mode==True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) #画出正方形
else:
cv2.circle(img,(x,y),3,(0,0,255),-1) #写字,有一系列小点组成
elif event==cv2.EVENT_LBUTTONUP:
drawing=False
img=np.ones((600,600,3),np.uint8)*50
cv2.namedWindow('image')
cv2.setMouseCallback('image',call_back_draw)
while True:
cv2.imshow('image',img)
if cv2.waitKey(1)==ord('m'): #更换模式
mode=not mode
elif cv2.waitKey(1)==ord('q'): #退出绘画
break
cv2.destroyAllWindows()
代码结果如图所示:
2.3.3 调节滑块改变图片亮度
from cv2 import cv2 as cv
import numpy as np
import sys
#cv.createTrackbar()
#cv.getTrackbarPos()
def call_back_brightness(param):
global value,img,img1 #定义全局变量
value = cv.getTrackbarPos('brightness','Brighter') #从滑块处获取值
img1 = np.uint8(np.clip((value/100*img),10,255)) #将值限制在10到255之间
img = cv.imread(r"C:\Users\my magicbook\Desktop\CV-Pictures\006.jpg")
img1 = img.copy()
if img is None: #如果找不到图片
print("Failed to read the lena.jpg")
sys.exit()
cv.namedWindow("Brighter",cv.WINDOW_NORMAL)
value = 80 #初始值
cv.createTrackbar("brightness","Brighter",value,255,call_back_brightness) #创建移动滑块,最大值为255
while True:
cv.imshow("Brighter",img1)
if cv.waitKey(2) == 27: #按Esc退出
break
cv.destroyAllWindows()
运行结果如图所示:
2.3.4 调节滑块生成BGR颜色
import cv2
import numpy as np
img=np.zeros((150,400,3),np.uint8) #画板大小
def doChange(param):
b = cv2.getTrackbarPos('B','tracebar') #获取b滑块所示颜色
g = cv2.getTrackbarPos('G', 'tracebar') #获取g滑块所示颜色
r = cv2.getTrackbarPos('R', 'tracebar') #获取r滑块所示颜色
img[:]=[b,g,r] #集成到img画板中
cv2.namedWindow('tracebar') #重命名窗口
cv2.createTrackbar('B','tracebar',0,255,doChange) #创建B滑块,初始化为0,最大值为255,通过改变doChange,改变滑块位置
cv2.createTrackbar('G','tracebar',0,255,doChange) #创建G滑块,初始化为0,最大值为255,通过改变doChange,改变滑块位置
cv2.createTrackbar('R','tracebar',0,255,doChange) #创建R滑块,初始化为0,最大值为255,通过改变doChange,改变滑块位置
while True:
cv2.imshow('tracebar',img)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
三、代码文件
小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。
链接:https://pan.baidu.com/s/1Ce14ZQYEYWJxhpNEP1ERhg?pwd=7mvf
提取码:7mvf