python中PIL.Image和OpenCV图像格式相互转换
PIL.Image转换成OpenCV格式:
[python] view plain copy
- import cv2
- from PIL import Image
- import numpy
- image = Image.open("plane.jpg")
- image.show()
- img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
- cv2.imshow("OpenCV",img)
- cv2.waitKey()
OpenCV转换成PIL.Image格式:
[python] view plain copy
- import cv2
- from PIL import Image
- import numpy
- img = cv2.imread("plane.jpg")
- cv2.imshow("OpenCV",img)
- image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
- image.show()
- cv2.waitKey()
判断图像数据是否是OpenCV格式:
isinstance(img, np.ndarray)
PIL(RGB)
首先介绍PIL(Python Imaging Library)这个库,这是Python中最基础的图像处理库,主要注意对图片进行处理时w,h的变化
-
from PIL import Image
-
import numpy as np
-
image = Image.open('test.jpg') # 图片是400x300 宽x高
-
print type(image) # out: PIL.JpegImagePlugin.JpegImageFile
-
print image.size # out: (400,300)
-
print image.mode # out: 'RGB'
-
print image.getpixel((0,0)) # out: (143, 198, 201)
-
# resize w*h
-
image = image.resize((200,100),Image.NEAREST)
-
print image.size # out: (200,100)
-
'''
-
代码解释
-
**注意image是 class:`~PIL.Image.Image` object**,它有很多属性,比如它的size是(w,h),通道是RGB,,他也有很多方法,比如获取getpixel((x,y))某个位置的像素,得到三个通道的值,x最大可取w-1,y最大可取h-1
-
比如resize方法,可以实现图片的放缩,具体参数如下
-
resize(self, size, resample=0) method of PIL.Image.Image instance
-
Returns a resized copy of this image.
-
:param size: The requested size in pixels, as a 2-tuple:
-
(width, height).
-
注意size是 (w,h),和原本的(w,h)保持一致
-
:param resample: An optional resampling filter. This can be
-
one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BOX`,
-
:py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.HAMMING`,
-
:py:attr:`PIL.Image.BICUBIC` or :py:attr:`PIL.Image.LANCZOS`.
-
If omitted, or if the image has mode "1" or "P", it is
-
set :py:attr:`PIL.Image.NEAREST`.
-
See: :ref:`concept-filters`.
-
注意这几种插值方法,默认NEAREST最近邻(分割常用),分类常用BILINEAR双线性,BICUBIC立方
-
:returns: An :py:class:`~PIL.Image.Image` object.
-
'''
-
image = np.array(image,dtype=np.float32) # image = np.array(image)默认是uint8
-
print image.shape # out: (100, 200, 3)
-
# 神奇的事情发生了,w和h换了,变成(h,w,c)了
-
# 注意ndarray中是 行row x 列col x 维度dim 所以行数是高,列数是宽
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
Skimage(RGB)
skimage即是Scikit-Image,官网
-
import skimage
-
from skimage import io,transform
-
import numpy as np
-
image= io.imread('test.jpg',as_grey=False)
-
# 第一个参数是文件名可以是网络地址,第二个参数默认为False,True时为灰度图
-
print type(image) # out: numpy.ndarray
-
print image.dtype # out: dtype('uint8')
-
print image.shape # out: (300, 400, 3) (h,w,c)前面介绍了ndarray的特点
-
# mode也是RGB
-
print image
-
'''
-
注意此时image里都是整数uint8,范围[0-255]
-
array([
-
[ [143, 198, 201 (dim=3)],[143, 198, 201],... (w=200)],
-
[ [143, 198, 201],[143, 198, 201],... ],
-
...(h=100)
-
], dtype=uint8)
-
'''
-
image= io.imread('test.jpg',as_grey=True)
-
print image.shape # out: (300, 400)
-
print image
-
'''
-
此时image范围变为[0-1]
-
array([[ 0.73148549, 0.73148549, 0.73148549, ..., 0.73148549,
-
0.73148549, 0.73148549],
-
[ 0.73148549, 0.73148549, 0.73148549, ..., 0.73148549,
-
.....]])
-
'''
-
print image.dtype # out: dtype('float64')
-
image = io.imread('test.jpg',as_grey=False)
-
# h*w
-
image = transform.resize(image,(100, 200),order=1) # order默认是1,双线性
-
#resize后image范围又变成[0-1]
-
print image.dtype # out: dtype('float64')
-
print image.shape # out: (100, 200, 3)
-
print image
-
'''
-
array([[[ 0.56078431, 0.77647059, 0.78823529],
-
[ 0.56078431, 0.77647059, 0.78823529],
-
[ 0.56078431, 0.77647059, 0.78823529],
-
..., ...]])
-
'''
-
'''
-
resize函数接口
-
resize(image, output_shape, order=1, mode='constant', cval=0, clip=True, preserve_range=False)
-
order : int, optional
-
The order of interpolation. The order has to be in the range 0-5:
-
- 0: Nearest-neighbor
-
- 1: Bi-linear (default)
-
- 2: Bi-quadratic
-
- 3: Bi-cubic
-
- 4: Bi-quartic
-
- 5: Bi-quintic
-
'''
-
print skimage.img_as_float(image).dtype # out: float64
-
# img_as_float可以把image转为double,即float64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
OpenCV(python版)(BGR)
OpenCV是个很强大的图像处理库,性能也很好。
-
import cv2
-
import numpy as np
-
image = cv2.imread('test.jpg')
-
print type(image) # out: numpy.ndarray
-
print image.dtype # out: dtype('uint8')
-
print image.shape # out: (300, 400, 3) (h,w,c) 和skimage类似
-
print image # BGR
-
'''
-
array([
-
[ [143, 198, 201 (dim=3)],[143, 198, 201],... (w=200)],
-
[ [143, 198, 201],[143, 198, 201],... ],
-
...(h=100)
-
], dtype=uint8)
-
'''
-
# w*h
-
image = cv2.resize(image,(100,200),interpolation=cv2.INTER_LINEAR)
-
print image.dtype # out: dtype('uint8')
-
print image.shape # out: (200, 100, 3)
-
'''
-
注意注意注意 和skimage不同
-
resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
-
关键字参数为dst,fx,fy,interpolation
-
dst为缩放后的图像
-
dsize为(w,h),但是image是(h,w,c)
-
fx,fy为图像x,y方向的缩放比例,
-
interplolation为缩放时的插值方式,有三种插值方式:
-
cv2.INTER_AREA:使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN方法
-
cv2.INTER_CUBIC: 立方插值
-
cv2.INTER_LINEAR: 双线形插值
-
cv2.INTER_NN: 最近邻插值
-
[详细可查看该博客](http://www.tuicool.com/articles/rq6fIn)
-
'''
-
'''
-
cv2.imread(filename, flags=None):
-
flag:
-
cv2.IMREAD_COLOR 1: Loads a color image. Any transparency of image will be neglected. It is the default flag. 正常的3通道图
-
cv2.IMREAD_GRAYSCALE 0: Loads image in grayscale mode 单通道灰度图
-
cv2.IMREAD_UNCHANGED -1: Loads image as such including alpha channel 4通道图
-
注意: 默认应该是cv2.IMREAD_COLOR,如果你cv2.imread('gray.png'),虽然图片是灰度图,但是读入后会是3个通道值一样的3通道图片
-
'''
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
在进行图像处理时一点要注意 各个库之间的细微差异,还有要注意图像放缩时插值方法的选择,而且即使是相同的插值方法,各个库的实现也不同,结果也会有些许差异。