这个是我们的素材
代码语言: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