Skip to content

Instantly share code, notes, and snippets.

@wellflat
Last active January 22, 2018 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wellflat/8d007222bfac5f734ef3790522a322a6 to your computer and use it in GitHub Desktop.
Save wellflat/8d007222bfac5f734ef3790522a322a6 to your computer and use it in GitHub Desktop.
libvipsで高速省メモリな画像処理 part1 http://rest-term.com/archives/3434/
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# pyvips の使い方"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ドキュメント\n",
"* [pyvips – Image processing with libvips](https://jcupitt.github.io/pyvips/)\n",
"* [jcupitt/pyvips](https://github.com/jcupitt/pyvips)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# jupyter notebook上での画像表示用\n",
"from IPython.display import Image, display_png"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# pyvipsモジュールのロード\n",
"import pyvips"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 画像読み込み、フォーマットは拡張子から判断される\n",
"image = pyvips.Image.new_from_file('libvips_logo.png', access='sequential')"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<pyvips.Image 566x119 uchar, 4 bands, srgb>"
]
},
"execution_count": 186,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"image"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pyvips.Image.new_from_file関数の __access__ 引数は'random'と'sequential'が選択できる (デフォルトは'random') \n",
"'sequential'を指定すると画像データの上から下方向に順に走査する際、先読みでバッファリングしながら読み込みされるので効率が良くなる"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjYAAAB3CAYAAAAQLQrVAAABS2lUWHRYTUw6Y29tLmFkb2JlLnht\ncAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQi\nPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1Q\nIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPgog\nPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50\nYXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiA8L3JkZjpSREY+Cjwv\neDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+nhxg7wAAIABJREFUeJztnXlgVNXZ/z+T2bdM\n9knCmhBIWGSXfVU2EVCRxbWttsXWX237WtvavqjV2r5arfpqX63W2kVr6y6KIAICgoDsyCI7AUL2\ndSYzmZnMZH5/zEAmycxkQibbnfP5C3LP3O95zr33uc95znJlqT963EukyCIvGhU6W6+rdIWdEtP1\ngqyTJbtKN1auqbBTWrrCTmnpNtOLi/yXXdRAAkFPo0uCmi7QjVGnKVldYae0dGPFziCxSeSBjXCa\n0tDrKl1hp7R0Y8XOLuvQiY6kQBARQWKTyAIb4TQ7COE0BYJujci+SUtX2Ckt3RB6bRiKEkQd4TSl\npSvslJausFNiuqIjGSu0HtiIh0waepeJlYcsVuwUCAQRITqS0tINoycyNrFGzDxkna0nnImkdIWd\n0tIVdkpMN7xe+MBGXBRp6HWVbqzYKVLcHUys2CkQCCKilY5rmMAmVpxJrNgp6DBEiruDdTtbL0YC\ncmGntHRjxc4I3tmhA5uYcSadrRcjN5+wU1q6sWKnyL51MLFip6DDiOCdrQj+Q+E0OwbhNHsUS39C\n6fjk0MfL95L25IchDy+791f8KUsX8njl2ffIe/FA8INjvsexW/qRFOrHtnx+9OirvB26dpLhmQd+\nzx0poY+f2f1rJrwXJTGRfetg3c7Wi5F3i7CzCWLycGcinKY0daVOrFxPYafEdEVHsmPpvna2DGzE\n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\n6V6h3v8HKNaFXpubYmoAAAAASUVORK5CYII=\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_png(Image('libvips_logo.png'))"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['width', 'height', 'bands', 'format', 'coding', 'interpretation', 'xoffset', 'yoffset', 'xres', 'yres', 'filename', 'vips-loader', 'vips-sequential']\n",
"566 119 uchar 4 srgb\n"
]
}
],
"source": [
"# 参照できるメタデータのフィールド\n",
"print(image.get_fields())\n",
"# メタデータ取得\n",
"print(image.width, image.height, image.format, image.bands, image.interpretation)"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"outputs": [],
"source": [
"image *= [1, 1, 2, 1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"画像全体に対して画素毎の各チャンネルの値を一括(element-wise)で編集できる \n",
"上記の例ではRGBAチャンネルの内、B(青)のチャンネル値を2倍に変更している \n",
"(JPEGの場合はアルファチャンネルが存在しないので、[1, 1, 2]のように指定する)"
]
},
{
"cell_type": "code",
"execution_count": 190,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"mask = pyvips.Image.new_from_array(\n",
" [[-1, -1, -1],\n",
" [-1, 9, -1],\n",
" [-1, -1, -1]],\n",
" scale=1\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"畳み込みフィルタ用のカーネルを準備、上記の例では先鋭化(シャープネス)のカーネルを生成"
]
},
{
"cell_type": "code",
"execution_count": 191,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<pyvips.Image 3x3 double, 1 bands, matrix>"
]
},
"execution_count": 191,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mask"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [],
"source": [
"## 上記で作成したカーネルを用いて畳み込みフィルタを適用\n",
"image = image.conv(mask, precision='integer')"
]
},
{
"cell_type": "code",
"execution_count": 193,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 画像書き出し、読み込みと同様にフォーマットは拡張子から判断される\n",
"image.write_to_file('libvips_logo_output.png')"
]
},
{
"cell_type": "code",
"execution_count": 194,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_png(Image('libvips_logo_output.png'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## NumPy配列への変換"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"NumPy配列(numpy.ndarray)との相互変換が可能、OpenCVとの連携などで活用できる "
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
"image = pyvips.Image.new_from_file('input.jpg', access='sequential')"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<pyvips.Image 533x800 uchar, 3 bands, srgb>"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"image"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
"# pyvips.Image -> numpy.ndarray\n",
"ndarray = np.ndarray(buffer=image.write_to_memory(), dtype=np.uint8, shape=[image.height, image.width, image.bands])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pyvips.Imageのデータををメモリに一時書き込み、要素の型とサイズを指定して numpy.ndarray に変換"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# numpy.ndarray -> pyvips.Image\n",
"height, width, bands = ndarray.shape\n",
"linear = ndarray.reshape(width * height * bands)\n",
"viimage = pyvips.Image.new_from_memory(linear.data, width, height, bands, 'uchar')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"numpy.ndarrayのデータを一次元配列にしてから、要素の型とサイズを指定して pyvips.Image に変換"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment