Pythonによる画像およびオフィス文書の操作

プログラムによる画像やオフィス文書の処理は、実際の開発で頻繁に登場します。Pythonの標準ライブラリにはこれらの操作に直接対応するモジュールは含まれていませんが、Pythonエコシステム内のサードパーティ製モジュールを利用することで、これらのタスクを実行できます。

画像処理

コンピュータ画像の基本

  1. 色: 絵の具で絵を描いた経験があれば、赤、黄、青の3色を混ぜ合わせることで他の色が得られることを知っているでしょう。これらは美術の三原色と呼ばれ、それ以上分解できない基本的な色です。コンピュータでは、赤、緑、青の3つの光源を異なる割合で重ね合わせることで、他の色を生成できます。そのため、通常、色はRGB値またはRGBA値(Aはアルファチャンネルで、画像の透過度、つまり不透明度を決定します)で表現されます。
色名 RGBA値 色名 RGBA値
白 (255, 255, 255, 255) 赤 (255, 0, 0, 255)
緑 (0, 255, 0, 255) 青 (0, 0, 255, 255)
灰 (128, 128, 128, 255) 黄 (255, 255, 0, 255)
黒 (0, 0, 0, 255) 紫 (128, 0, 128, 255)
  1. ピクセル: 数値シーケンスで表現される画像において、最小単位は画像上の単一色の小さな正方形です。これらの小さな正方形は明確な位置と割り当てられた色数値を持っており、これらの色と位置が画像の最終的な表示を決定します。これらは分割不可能な単位であり、通常「ピクセル(pixel)」と呼ばれます。各画像には一定量のピクセルが含まれており、これらのピクセルが画面上での画像のサイズを決定します。

Pillowを使用した画像操作

Pillowは、有名なPython画像処理ライブラリPILから派生したフォークであり、画像の圧縮や様々な画像処理操作を実行できます。Pillowは以下のコマンドでインストールできます。

pip install pillow

Pillowで最も重要なのはImageクラスです。画像の読み込みと処理はこのクラスを通じて行われます。


from PIL import Image

# 画像を開く
img = Image.open('guido.jpg')

# 画像のフォーマット、サイズ、モードを表示
print(img.format, img.size, img.mode)

# 画像を表示
img.show()

画像の切り抜き


from PIL import Image

# 画像を開く
img = Image.open('Guido.jpg')

# 切り抜く領域を定義 (左上のx, 左上のy, 右下のx, 右下のy)
crop_area = (80, 20, 310, 360)

# 画像を切り抜いて表示
img.crop(crop_area).show()

サムネイル(縮小画像)の生成


from PIL import Image

# 画像を開く
img = Image.open('Guido.jpg')

# 目標サイズを定義
target_size = (128, 128)

# 画像をリサイズしてサムネイルを作成
img.thumbnail(target_size)

# サムネイルを表示
img.show()

画像の拡大縮小と貼り付け


from PIL import Image

# ベース画像と貼り付ける画像を開く
base_img = Image.open('./image/renwu.jpg')
overlay_img = Image.open('./image/Guido.jpg')

# 貼り付ける画像の一部を切り抜く
crop_rect = (80, 10, 380, 400)
part_to_paste = overlay_img.crop(crop_rect)

# 切り抜いた部分のサイズを取得
width, height = part_to_paste.size

# 切り抜いた部分をリサイズしてベース画像に貼り付ける
# 貼り付けるサイズを元のサイズの約0.8倍に縮小
resize_factor = 1.2
resized_part = part_to_paste.resize((int(width / resize_factor), int(height / resize_factor)))
base_img.paste(resized_part, (160, 10))

# 結果を表示
base_img.show()

画像の回転と反転


from PIL import Image

# 画像を開く
img = Image.open('./image/Guido.jpg')

# 画像を180度回転して表示
img.rotate(180).show()

ピクセルの操作


from PIL import Image

# 画像を開く
img = Image.open('./image/Guido.jpg')

# 画像の一部領域のピクセル色を変更
# 範囲: x=80から310、y=20から360
for x in range(80, 310):
    for y in range(20, 360):
        # ピクセル色をグレーに設定 (R, G, B)
        img.putpixel((x, y), (128, 128, 128))

# 変更後の画像を表示
img.show()

フィルター効果


from PIL import Image, ImageFilter

# 画像を開く
img = Image.open('./image/Guido.jpg')

#輪郭検出フィルターを適用して表示
img.filter(ImageFilter.CONTOUR).show()

Excelスプレッドシートの処理

Pythonのopenpyxlモジュールを使用すると、Pythonプログラム内でExcelスプレッドシートを読み書きできます。Microsoft Office 2007以降では新しいファイル形式が採用されていますが、Office Excel、LibreOffice Calc、OpenOffice Calcは完全に互換性があります。これは、openpyxlモジュールがこれらのソフトウェアで生成されたスプレッドシートも処理できることを意味します。


import datetime
from openpyxl import Workbook

# 新しいワークブックを作成
wb = Workbook()
# アクティブなワークシートを取得
ws = wb.active

# セルに値を代入
ws['A1'] = 42
# 行を追加
ws.append([1, 2, 3])
# 現在の日時を代入
ws['A2'] = datetime.datetime.now()

# ファイルを保存
wb.save("sample.xlsx")

Word文書の処理

python-docxモジュールを利用することで、PythonはWord文書を作成および編集できます。ここでいうWord文書とは、Microsoft Officeソフトウェアで作成された拡張子.docxのドキュメントだけでなく、LibreOffice WriterやOpenOffice Writerといった無料のワープロソフトで作成されたドキュメントも対象となります。


from docx import Document
from docx.shared import Inches

# 新しいドキュメントを作成
document = Document()

# タイトルを追加
document.add_heading('Document Title', level=0)

# 通常の段落を追加し、一部を太字や斜体に設定
p = document.add_paragraph('A plain paragraph having some ')
run_bold = p.add_run('bold')
run_bold.bold = True
p.add_run(' and some ')
run_italic = p.add_run('italic.')
run_italic.italic = True

# レベル1の見出しを追加
document.add_heading('Heading, level 1', level=1)
# 特定のスタイルを持つ段落を追加
document.add_paragraph('Intense quote', style='Intense Quote')

# 箇条書きリストの項目を追加
document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
# 番号付きリストの項目を追加
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

# 画像を挿入
document.add_picture('monty-truth.png', width=Inches(1.25))

# テーブルデータを定義
records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

# テーブルを作成 (ヘッダー行1行、列3つ)
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'

# レコードを行として追加
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

# ページ区切りを追加
document.add_page_break()

# ドキュメントを保存
document.save('demo.docx')

タグ: Pillow ImageMagick openpyxl python-docx 画像処理

6月11日 20:31 投稿