画像処理ライブラリ (Opencv、Matplotlib、PIL) と 3 つの間の変換

1.OpenCV

opencv の基本的な画像タイプは numpy 配列との間で変換できるため、直接呼び出してtorch.from_numpy(img)画像を次のように変換できます。tensor

  • 読み取り:img=cv2.imread(path)
    OpenCV は画像を読み取った後、チャネル順序、値範囲numpy.ndarrayの形式で代表的な画像を返します(H,W,C)BGR[0,255]dtype=uint8
import cv2
def read_img_cv(path):
	img_cv=cv2.imread(path)
	return img_cv
  • 見せる:cv2.imshow(name,img)
import cv2
def show_img_cv(img_cv):
	cv2.imshow("Image", img_cv)
	cv2.waitKey(0)  # 暂停显示图片,数字0代表按键后 0 ms执行
  • 保存: cv2.imwrite(path, img)
import cv2
def save_img_cv(img_cv,path):
	cv2.imwrite(path, img_cv)  # 保存图片

2.Matplotlib

matplotlibは、MATLAB描画をベースにPythonで開発された画像描画ライブラリです。tesnormatplotlib でプロットする場合、データの読み取りと型指定が可能ですnumpy

  • 読む:img=mpimg.imread(path)

グレースケール イメージの場合: (H, W) 形状の配列を返します
。RGB イメージの場合、(H, W, 3) 形状の配列を返します。RGBA の場合、イメージ チャネルの順序は次のとおりですRGB
。画像、 (HW, 4) 形状の配列を返します。ピクチャ チャネルの順序は次のとおりです。RGBA

さらに、PNG 画像は float (0-1) の配列として返され、他のすべての形式は、特定の画像によって決定されるビット深度を持つdtype=float32int の配列として返されます。dtype=uint8

import matplotlib.image as mpimg
def read_img_mat(path):
	img_mat=mpimg.imread(path)
	return img_mat
  • 見せる:plt.imshow(img) plt.show()
  1. カラーマップを表示
import matplotlib.pyplot as plt
# 如果在jupyter notebook中显示,需要添加如下一行代码
%matplotlib inline

def show_img_mat(img_mat):
	plt.imshow(img_mat)
	plt.axis('off')
	plt.show()
  1. グレースケール イメージを表示する
    matplotlib はイメージを表示します。デフォルトでは、イメージは 3 つのチャネルで表示されます。 plt.imshow() にパラメーターを追加する必要がありますgray
def show_img_gray(img_gray):
	plt.imshow(img_gray,cmap='gray')
	plt.axis('off')
	plt.show()
  1. 表示Imageタイプのイメージ
def show_img_pil(img_pil):
	plt.imshow(img_pil)
	plt.axis('off')
	plt.show()
  • 保存:plt.imsave(name,img)
def save_img_pil(img_pil,name):
	plt.imsave(name,img_pil)

3.ピル

PIL は Python の画像処理用の基本ライブラリです。
画像のモードは次のとおりです。例1: バイナリ画像、Lグレースケール画像、P: 8 ビット カラー画像、 :画像RGBなどの 24 ビット カラー画像 (チャネルあたり 8 ビット) 、: より多くのアルファ チャネル (不透明度) RGB などの画像では、変換モードを使用できます。jpgRGBApng
img.convert(mode)
ここに画像の説明を挿入

  • 読み取り: img=Image.open(path) は
    型を読み取りますPIL.xxxImageFIie
import PIL
from PIL import Image
def read_img_pil(path):
	img_pil=Image.open(path) # PIL Image 类型
	return img_pil
  • 見せる:image.show()
def show_img_pil(img_pil):
	img_pil.show()
  • 保存: image.save(path)
def save_img_pil(img_pil,path):
	img_pil.save(path)

4. 3つの違いと相互変換


3つの違い

  • Opencv のデータ型はNumpy数组、チャネル順序は です。BGR
  • Matplotlib のデータ型は でNumpy数组、チャネル順序は です。RGB
  • PIL のデータ型は でPIL.Image类、チャネル順序は です。RGB

3つの画像処理ライブラリを相互変換

  • Opencv間のMatplotlib変換
# cv->mat
def cv2mat(img_cv):
	img_mat=cv2.cvtColor(img_cv,cv2.COLOR_BGR2RGB) # 将颜色通道从BGR改变成RGB
	# 另一种等价写法
	# img_mat=img_cv[:,:,::-1]
	return img_mat

def mat2cv(img_mat): # 将颜色通道从RGB改变成BGR
	img_cv=img_mat[:,:,::-1]
	return img_cv
  • Matplotlibimg-PIL
    np.asarry(img) >array
    Image.fromarray(array)array->img間の相互変換
# mat->PIL
#方法1:三通道的转换
def mat2PIL_RGB(img_mat):
	img_pil=Image.fromarray(img_mat.astype('uint8'))
	# unit8 是无符号的8位整形,用astype [0,255]截断处理
	# 另外一种写法
	# img_pil= Image.fromarray(np.unit8(img_mat))
	return img_pil 

# 方法2: 四通道的转换
def mat2PIL_RGBA(img_mat):
	img_pil=Image.fromarray(img_mat.astype('uint8')).convert('RGB')
	return img_pil

# 方法三:使用torchvision的库函数
from torchvision import transforms
def mat2PIL_trans(img_mat):
	trans=transformers.ToPILImage()
	img_pil=trans(img_mat)
	return img_pil
	
'''PIL->mat'''

def PIL2mat(img_pil):
	img_mat=np.array(img_pil) # 深拷贝
	# 如果是jpg格式,通道顺序是RGB, (H,W,3)
	# 如果是png格式,通道顺序是RGBA, (H,W,4)
	# 返回的类型均是`numpy.ndarray`, `dtype=unit8`, 取值返回[0,255]
	# 或者也可以采用浅拷贝
	# img_mat=np.asarray(img_pil)
	return img_mat

'''区间变换'''
# [0,255]->[0,1] 
def PIL2mat_norm(img_pil):
	img_mat=np.asarray(img_pil)/255.0
	return img_mat
# [0,1]->[0,255]
def mat_255(img_mat):
	img_mat=(np.maximum(img_mat, 0) / img_mat.max()) * 255.0 
	img_mat=np.unit8(img_mat)
  • Opencv間のPIL変換
# cv->PIL
#方法1:三通道的转换
def cv2PIL_RGB(img_cv):
	img_rgb = img_cv[:,:,::-1] # OpenCV 的通道顺序为 BGR, 转换成RGB
	# nparray 
	img_pil= Image.fromarray(np.uint8(img_rgb))
	return img_pil 

# 方法2: 四通道的转换
def cv2PIL_RGBA(img_cv):
	img_rgb = img_cv[:,:,::-1]
	img_pil=Image.fromarray(img_rgb.astype('uint8')).convert('RGB')
	return img_pil

# 方法三:使用torchvision的库函数
from torchvision import transforms
def cv2PIL_trans(img_cv):
	img_rgb = img_cv[:,:,::-1]
	trans=transformers.ToPILImage()
	img_pil=trans(img_rgb)
	return img_pil
	
# PIL->cv
def PIL2cv(img_pil):
	img_ary=np.array(img_pil) # 深拷贝,通道顺序是 RGB, (H,W,C)
	# 或者也可以采用深拷贝
	# img_ary=np.asarray(img_pil)
	img_cv=img_ary[:,:,-1]
	return img_cv

3つのフォーマットとTensor間の相互変換

  • numpy 形式を Tensor に変換する
import torch
def nparray2tensor(npary):
	ts=torch.from_numpy(npary)
	# 如果需要修改成浮点类型
	# ts=torch.from_numpy(npary).float()
	return ts
  • PIL および numpy 形式を Tensor に変換すると、
    torchvision の関数を使用して、 transforms.ToTensor()
    PIL のImageor numpy.ndarray(dtype=unit8): size (H,W,C) , rangeを: size , range[0,255]に変換できます。torch.FloatTensor(C,H,W)[0.0,1.0]
from torchvision import transforms
# img_pil: Image
trans=transforms.ToTensor() 
tens=trans(img_pil) # (C,H,W) [0.0,1,0]
# tens_hwc=tens.transpose((1,2,0))

5.Torchvision の関連変換ライブラリ

5.1 ToPILImage([モード])

CLASS
torchvision.transforms.ToPILImage(mode=None)
  • 関数

    tensor または ndarray を PIL イメージに変換します。これにより値はスケーリングされません。この変換は torchscript をサポートしていません。

    値の範囲を維持したまま、C x H x W形状または のtorch.*Tensor形状を変換します。H x W x Cnumpy ndarrayPIL图像

  • パラメータ

    • mode(PIL.Image mode)入力データの色空間とピクセル深度 (オプション)。モードが None (デフォルト) の場合、入力データに関して次のことが想定されます。
      • 入力が 4 チャンネルの場合、モードは RGBA とみなされます。
      • 入力が 3 チャンネルの場合、RGB モードとみなされます。
      • 入力が2チャンネルの場合はLAモードとみなされます。
      • 入力に ​​1 チャネルがある場合、モードはデータ型 (つまり、int、float、short) によって決まります。

5.2 ToTensor

CLASS
torchvision.transforms.ToTensor
  • 関数:

    PIL イメージまたは ndarray をテンソルに変換し、それに応じてスケーリングします。この変換は torchscript をサポートしていません。

    PIL Imageor in- [0,255]intervalを in -intervalnumpy.ndarray (H x W x C)変換しますここで、PIL Image はいずれかのモードに属し、numpy.Ndarray の場合は、スケーリングなしでテンソルが返されます。[0.0,1.0]torch.FloatTensor (C x H x W)(L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1)dtype = np.uint8

5.3 ARROWTensor

CLASS
torchvision.transforms.PILToTensor
  • 関数

    PIL イメージを同じタイプのテンソルに変換します。これにより値はスケーリングされません。この変換は torchscript をサポートしていません。

    PIL Image (H x W x C)形状に変換するテンソル(C x H x W)

おすすめ

転載: blog.csdn.net/zyw2002/article/details/131898067