Python使用scipy和numpy操作處理影象
阿新 • • 發佈:2019-01-06
之前使用Python處理資料的時候都是一些簡單的plot。今天遇見了需要處理大量畫素點,並且顯示成圖片的問題,無奈水淺,一籌莫展。遂Google之。
找到如下站點,真心不錯。準備翻譯之~~~
http://scipy-lectures.github.io/advanced/image_processing/index.html
Writing an array to a file:
from scipy import misc l = misc.lena() misc.imsave('lena.png', l) # uses the Image module (PIL) import matplotlib.pyplotas plt plt.imshow(l) plt.show()
Creating a numpy array from an image file:
>>> from scipy import misc >>> lena = misc.imread('lena.png') >>> type(lena) <type 'numpy.ndarray'> >>> lena.shape, lena.dtype ((512, 512), dtype('uint8'))
dtype is uint8 for 8-bit images (0-255)
Opening raw files (camera, 3-D images)
>>> l.tofile('lena.raw') # Create raw file >>> lena_from_raw = np.fromfile('lena.raw', dtype=np.int64) >>> lena_from_raw.shape (262144,) >>> lena_from_raw.shape = (512, 512) >>> import os >>>os.remove('lena.raw')
Need to know the shape and dtype of the image (how to separate databytes).
For large data, use np.memmap for memory mapping:
>>> lena_memmap = np.memmap('lena.raw', dtype=np.int64, shape=(512, 512))
(data are read from the file, and not loaded into memory)
Working on a list of image files
>>> for i in range(10): ... im = np.random.random_integers(0, 255, 10000).reshape((100, 100)) ... misc.imsave('random_%02d.png' % i, im) >>> from glob import glob >>> filelist = glob('random*.png') >>> filelist.sort()
Use matplotlib and imshow to display an image inside amatplotlib figure:
>>> l = misc.lena() >>> import matplotlib.pyplot as plt >>> plt.imshow(l, cmap=plt.cm.gray) <matplotlib.image.AxesImage object at 0x3c7f710>
Increase contrast by setting min and max values:
>>> plt.imshow(l, cmap=plt.cm.gray, vmin=30, vmax=200) <matplotlib.image.AxesImage object at 0x33ef750> >>> # Remove axes and ticks >>> plt.axis('off') (-0.5, 511.5, 511.5, -0.5)
Draw contour lines:
>>> plt.contour(l, [60, 211]) <matplotlib.contour.ContourSet instance at 0x33f8c20>