关于图像的一些基本操作
Posted Eureka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于图像的一些基本操作相关的知识,希望对你有一定的参考价值。
一、Numpy
# numpy图像使用np来reshape
img = np.reshape(img,(new_H,new_W,new_C))
img = img.reshape(new_H,new_W,new_C) # 另一种写法
# 以上两种写法等价,另外不能去掉“img = ”,否则没有reshape效果。
# new_W*new_H*new_C 必须等于 old_H*old_W*old_C。 否则会报错
# 这种reshape不建议用于图像,因为它会搞乱HW与C之间的关系,破坏掉图像
# numpy图像使用np来resize
img=np.resize(img,(new_H,new_W,new_C))
img.resize(new_H,new_W,new_C) # 另一种写法
# 以上两种写法等价,并且不能加上“img = ”,否则会报错。
# new_W*new_H*new_C 必须等于 old_H*old_W*old_C。 否则会报错
# 这种resize也不建议用于图像,因为它会搞乱HW与C之间的关系,破坏掉图像
img = np.zeros((H,W),dtype=np.uint8)
二、CV2
# 读取numpy图像
img = cv2.imread(\'test.jpg\', 0) # 这个参数0,等价于:cv2.IMREAD_GRAYSCALE (灰度)
# 加一个参数0表示读取灰度图
# H,W,C = img.shape
# numpy图像使用cv2来resize
img = cv2.resize(img, (new_W, new_H), interpolation=cv2.INTER_LINEAR)
# new_W*new_H 可以不等于 old_H*old_W,结果就是形变
# 可以不写“img = ”这一部分,因为图像cv2.resize,它真实的形状就被改变了,而不是在副本上改的
# W(宽)方向为x轴; H(高)方向为y轴
1. cv2.circle(img, (圆心x,圆心y) ,半径, (255,255,255), -1)
2. cv2.rectangle(img, (左上角x,左上角y), (右上角x,右上角y), (255,255,255), -1)
3. 数组操作:img[y][x]。即先遍历行,再遍历列,符合c或python语言中正常数组的顺序
三、PIL
# PIL读取数据
img = Image.open(\'test.jpg\').convert(\'L\')
# 加一个convert表示读取灰度图
# W,H = img.size
img = img.resize((new_W, new_H), Image.BILINEAR)
# new_W*new_H 可以不等于 old_H*old_W,结果就是形变
# 在副本上修改的,前面必须加“img = ”
四、matplotlib
from PIL import Image
img=Image.open(\'1.png\')
img.show()
PIL使用open()函数来打开图片,使用show()函数来显示图片。这种图片显示方式是调用操作系统自带的图片浏览器来打开图片,有些时候这种方式不太方便,因此我们也可以使用另上一种方式,让程序来绘制图片。
from PIL import Image
img=Image.open(\'1.png\')
import matplotlib.pyplot as plt
plt.ion() # 将交互操作模式打开,用来依次打开多张图片,即上一张关闭,下一张打开的这种顺序操作
plt.imshow(img)
plt.show() # 图片展示
img.save(\'1.jpg\') # 图片保存
plt.axis(\'off\') # 去除坐标轴
plt.savefig(\'1.jpg\')# 图片保存,会生成坐标轴,并且会改边图像的原尺寸,不好用
这种方法虽然复杂了些,但推荐使用这种方法,它使用一个matplotlib的库来绘制图片进行显示。matplotlib是一个专业绘图的库,相当于matlab中的plot。
另外需要注意的是,如果想用matplotlib来展示或保存图片,建议用PIL来读取,不建议用cv2。
因为PIL读取图片的通道顺序是R、G、B,符合matplotlib的要求;
而如果用cv2来读取,通道顺序是B、G、R,可以展示并保存,但是颜色会变得很奇怪。
五、tensor
H,W,C = tensor.shape
# 直接保存tensor图像
from torchvision import utils as vutils
vutils.save_image(tensor_img, \'./test.jpg\', normalize=True)
*、 PIL与cv2相互转化
# PIL转cv2:
img = cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)
# cv2转PIL:
img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
以上是关于关于图像的一些基本操作的主要内容,如果未能解决你的问题,请参考以下文章
来自 FragmentActivity 的片段在某些设备上不显示背景图像
如何在片段中使用 GetJsonFromUrlTask.java