OpenCV-Python学习教程.5

2021-05-18 11:24:30 浏览数 (1)

这个是我们的素材

代码语言:javascript复制
C:UsersyunswjDesktopPython可视化PILimg1.jpg
代码语言:javascript复制
PILimg1.jpg

上面是我们的两个路径:

代码语言:javascript复制
image = cv2.imread('./PIL/img/1.jpg')

这个路径是我们一直要使用的路径

首先就是要解决一个图像的路径错误的问题:

代码语言:javascript复制
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UX

转义的方式 -----> 'c:\c.txt'

显式声明字符串不用转义---> r'c:c.txt' 在路径字符串前加r

使用Linux的路径/ ----> 'c:/c.txt' 在路径中使用/ 来分隔路径

代码语言:javascript复制
from PIL import Image
from numpy import array
from pylab import *
# 读取图像奥数组里面
# im = array(Image.open("C:UsersyunswjDesktopPython可视化PILimg1.jpg"))
im = array(Image.open('./PIL/img/1.jpg'))
# 绘制图像
imshow(im)

看我写的是什么,右下角的反斜杠。

默认输出的图像

代码语言:javascript复制
print(type(im))
print(im)

可以看到虽然我们没有吧numpy的库放进来,但是内部的实现就是这样

使用了numpy的多维数组

代码语言:javascript复制
from PIL import Image
from numpy import array
from pylab import *
# 读取图像奥数组里面
# im = array(Image.open("C:UsersyunswjDesktopPython可视化PILimg1.jpg"))
im = array(Image.open('./PIL/img/1.jpg'))
# 绘制图像
imshow(im)
# print(type(im))
# print(im)
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
# 一些点
plot(x, y, 'r*')
# 红色的星状来绘制标记点

plot(
    x[:2], y[:2]
)
# 绘制连接前两个点
title(
    'Plotting : "empire.jpg"'
)
# 添加标题,就是注意要  '   ""  '这个样子的写法
show()

绘制了元素

代码语言:javascript复制
axis('off')

可以选择关掉坐标轴

代码语言:javascript复制
from typing import Counter
from PIL import Image
from numpy import array
from pylab import *
im = array(Image.open('./PIL/img/1.jpg').convert('L'))
# 这里就是转一个灰度的图像

# 新建一个图像
figure()

# 不适用颜色信息
gray()

# 在原点的左上角显示轮廓的图像

contour(im, origin='image')
axis('equal')
axis('off')
# 关闭坐标轴

figure()
hist(im.flatten(), 128)
# 绘制直方图,第二个参数是指定小于区间的数目,因为hist()只能接收一维数组作为输入,先要对图像进行压平处理
show()

绘制一个图像的直方图

代码语言:javascript复制
from typing import Counter
from PIL import Image
from numpy import array
from pylab import *

vscode是很”smart“的,对于我的一些函数操作,会自动的将相关的库引入。

接下来我们写一个可以交互的小程序,点击图片,然后捕获这些点并且输出。

代码语言:javascript复制
UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure. % get_backend())

这里是参考一个博客解决的,链接在文末~

会出现这种错误,因为是版本的变动。报错信息说matplotlib包用的是后端是ipykernel.pylab.backend_inline,这个后端不支持在编译器前端显示。所以呢~为了支持所有的使用情形,matplotlib能够产生不同的输出,而把每一个不同输出的能力叫做一个后端。而前端就是用户需要处理的代码,如绘图代码,然后后端做的就是所有看不到的辛苦工作来生成视图窗口。这里有两种不同类型的后端:

1.用户接口后端(又叫做"交互式后端",如pygtk, wxpython, thinter,qt, macosx或者fltk)。

2.硬拷贝后端,也叫做非交互式后端,用来生成图像文件(PNG,SVG,PDF, PS)

所以matplotlib不显示图象就是当前的用户接口后端不支持前端显示并交互,所以我们需要自己配置。

有两种方式配置你的后端。

在matplotlibrc文件中设置后端参数

另外一种方式是使用matplotlib的use()命令。调用use()方法必须在import matplotlib.pyplot或者matplotlib.pylab之前设置

可以使用的后端有:

代码语言:javascript复制
 [‘GTK3Agg’, ‘GTK3Cairo’, ‘MacOSX’, ‘nbAgg’, ‘Qt4Agg’, ‘Qt4Cairo’, ‘Qt5Agg’, ‘Qt5Cairo’, ‘TkAgg’, ‘TkCairo’, ‘WebAgg’, ‘WX’, ‘WXAgg’, ‘WXCairo’, ‘agg’, ‘cairo’, ‘pdf’, ‘pgf’, ‘ps’, ‘svg’, ‘template’]
代码语言:javascript复制
from numpy import array
from pylab import *
matplotlib.use('TkAgg')  # 必须显式指明matplotlib的后端
im = array(Image.open('./PIL/img/1.jpg'))
imshow(im)
print("Please click3 points")
x = ginput(3)
print('You clicked:', x)
show()

绘图的代码:

代码语言:javascript复制
matplotlib.use('TkAgg')  # 必须显式指明matplotlib的后端

要指定一个后端,如果你没有安装QT的东西,就不要写我上面有qt的处理器,相反tk是一种内置的标准:

代码语言:javascript复制
Please click3 points
You clicked: [(344.5496688741722, 325.0794701986754), (679.8145695364238, 623.092715231788), (872.2814569536425, 548.5894039735099)]

完整运行的结果

代码语言:javascript复制
# from typing import Counter
from PIL import Image
from numpy import array
from pylab import *
# matplotlib.use('TkAgg')  # 必须显式指明matplotlib的后端
im = array(Image.open('./PIL/img/1.jpg'))
print(im.shape, im.dtype)

我们也可以,输出一些照片的基本的信息

代码语言:javascript复制
from PIL import Image
from numpy import array
from pylab import *
im = array(Image.open('./PIL/img/1.jpg').convert('L'))
print(im.shape, im.dtype)
im2 = 255 - im
# 对图像进行反相处理
im3 = (100.0/255)*im 100  # 将图像像素变换到100,200之间
im4 = 255.0*(im/255.0)**2
# 对图像像素值求平方后得到的图像
print(int(im3.min())), int(im3.max())
代码语言:javascript复制
# from typing import Counter...
(1350, 1080) uint8
100
(None, 200)
代码语言:javascript复制
https://blog.csdn.net/weixin_42610531/article/details/94718670

0 人点赞