PythonとOpenCVで画像のフィルター加工を試行錯誤しているのですが、実施したフィルターの組み合わせを記録しておく方法が無いか考えてみました。
テキストと画像をファイルとして保存するフォーマットは色々ありますが、スクリプトから作成しやすいのはテキストベースのフォーマットになります。そうなるとHTMLが良いだろうと言うことで、画像をBase64でエンコードしてHTMLに埋め込むことで単一HTMLで画像を表示できる形に出力するスクリプトを作ってみました。
テキストと画像をファイルとして保存するフォーマットは色々ありますが、スクリプトから作成しやすいのはテキストベースのフォーマットになります。そうなるとHTMLが良いだろうと言うことで、画像をBase64でエンコードしてHTMLに埋め込むことで単一HTMLで画像を表示できる形に出力するスクリプトを作ってみました。
#!/usr/bin/env python3
# coding: utf8
import cv2
import numpy as np
import os, glob
import base64
# 画像フィルターのテスト
# テキストファイルの書き込み
def write_html(file_name, title, body):
f = open(file_name, 'w', encoding='UTF-8')
text = '''<!DOCTYPE html>
<html lang="ja">
<head>
<title>{}</title>
</head>
<body>
{}
</body>
</html>'''
html = text.format(title, body)
f.write(html)
f.close()
# 画像を中心から指定サイズで切り出し
def trim_center(img, width, height):
h, w = img.shape[:2]
top = int((h / 2) - (height / 2))
bottom = top+height
left = int((w / 2) - (width / 2))
right = left+width
return img[top:bottom, left:right]
# 画像ファイルをbase64にエンコード
def img_to_base64(file_name):
f = open(dst_file, 'br')
bin = f.read()
b64data = base64.b64encode(bin)
result = b64data.decode("utf-8")
f.close()
return result
if __name__ == '__main__':
file_name = 'output.html'
title='TestFilters.py'
body='<div>hoge</div>'
src_file = 'C:/Users/PC01114/Pictures/202205061049.JPG'
dst_file = 'output.png'
width = height = 64
img = cv2.imread(src_file)
dst = trim_center(img, width, height)
cv2.imwrite(dst_file, dst)
body += "<img src='data:image/png;base64,{}'>".format(img_to_base64(dst_file))
os.unlink(dst_file)
write_html(file_name, title, body)
肝心のフィルター処理が無いので切り出した64×64画像が一つだけですが、とりあえず思った通りの動作はしてくれています。
コメント