关于图像的一些基本操作

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

markdown [mybatis参考]关于mybatis #mybatis的一些片段

灰度图像直方图变换的一些代码

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础