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
在进行图像处理时一点要注意 各个库之间的细微差异,还有要注意图像放缩时插值方法的选择,而且即使是相同的插值方法,各个库的实现也不同,结果也会有些许差异。