CADの普及で手書き(ドラフター)の時よりも図面は読みやすくなっています。
しかしながら、CADから図面管理システムに出力するときの線の太さ設定により、下記のようなことはないでしょうか?
- PC画面上でかなり拡大しないとはっきり読めない
- 紙に印刷したりFAX送信したら、かすれて読めない
- プリンタや複合機などの印刷デバイスの違いで、図面がかすれたりする
CADの設定を変更して出しなおしてもらうのがよいのですが、すでに図面管理システムの中に大量の線の細い図面が保管されていたらそれも難しいですよね?
一時期私も悩まされ、画像ファイルを一括で修正する有料のソフトを検討しましたが、これから説明する方法で無料で対応することができましたので、皆さんの参考になれば幸いです。
今回は、pythonでOpenCVライブラリのモルフォロジー変換を使用して図面画像の線自体を太くする方法をお伝えします。
下の画像は実際に処理をした後の比較画像です。上側の薄い(細い)線が太く濃くなっているのが確認できます。これぐらいはっきりすれば問題を解決できると思います。
今回もコピペしてpython実行環境上で実行すればすぐ使えるようにしていますので、プログラムの中身がわからなくても、「とりあえず図面の線を太くしたい!」という方にお勧めです。
プログラムの仕様など
線を太くできるファイルは、tiffなどの画像ファイルです。CADファイルは対象外です。
OpenCVの膨張処理は、太くできるのは白黒図面だけです。
白黒図面画像をPNGやJPEGファイルに出力して実行したところ、問題なく太くできておりますが、カラー画像の場合には、モノクロに変換されて処理されますのでご注意ください。
今回も便宜上Cドライブ直下にフォルダを作って説明しますが、「処理前のファイルを入れるbeforeフォルダ」と「処理済みのファイルが入るafterフォルダ」はpythonプログラム中でパスを設定するので、自分の都合の良いように変更ください。
プログラムが実行されると下図のように処理します。
- beforeフォルダから順次図面画像ファイルを取得します。
- pythonプログラムでOpenCVのモルフォロジー変換(膨張)を使用して線を太くします。
- 太くした図面画像を同じファイル名でafterフォルダに格納します
- 処理が完了したら、処理完了のメッセージが表示されます。
OpenCV(CV2)をpip install
基本的なpython実行環境がある前提で説明します。
画像処理用のOpenCVのライブラリは別途インストールが必要なので、インストールしていない人は下記手順でインストールしてください。
タスクバーのWindows検索窓に「cmd」と入力するとコマンドプロンプトの実行が表示されるので、選択してコマンドプロンプトを起動してください。
起動したらコマンドライン上で下記のコマンドを実行してください。
pip install opencv-python
インストールが成功すると下記画像のようにSuccessfullyの表示が出ます。
フォルダの用意
処理前の画像を入れるフォルダと、処理済みのファイルを入れるフォルダを用意します。
今回はc:\thicken-lineというフォルダの中にbeforeとafterのフォルダ構成で説明します。
pythonのコード内でフォルダを設定する箇所を書き換えれば、自分がアクセスできるフォルダであれば処理ができますので、名前やパスは任意に設定してもらって大丈夫です。
pythonのコード
下記のコードをコピーしてpythonファイル形式で保存してください。
今回の説明ではC:\thicken-lineフォルダの中にthicken-line.pyとして保管します。
# coding: utf-8
import cv2
import os
import numpy as np
from tkinter import messagebox
import glob
def main():
objfolder='C:/thicken-line/before' #ここのパスを任意のフォルダパスに書き換えてください。
outfolder='C:/thicken-line/after' #ここのパスを任意のフォルダパスに書き換えてください。
img_file_list=glob.glob(objfolder+'/*.*') #変換したい元のファイル拡張子が決まっている場合には.tifのように変更したほうが良いです。
for img_file_path in img_file_list:
#cv2.imreadは日本語不可なのでimread関数を別途作成
img=imread(img_file_path,0)
if img is not None: #画像ファイルで正常に読み込めた場合に処理する
kernel =np.ones((5,5),np.uint8) #膨張するパラメータ設定
erosion=cv2.erode(img,kernel,iterations=1) #膨張実行
outfilename=os.path.split(img_file_path)
#cv2.imwriteは日本語不可なのでimwrite関数を別途作成
imwrite(outfolder + '/' + outfilename[1],erosion)
messagebox.showinfo('確認','変換処理が完了しました')
def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
try:
n = np.fromfile(filename, dtype)
img = cv2.imdecode(n, flags)
return img
except Exception as e:
print(e)
return None
def imwrite(filename, img, params=None):
try:
ext = os.path.splitext(filename)[1]
result, n = cv2.imencode(ext, img, params)
if result:
with open(filename, mode='w+b') as f:
n.tofile(f)
return True
else:
return False
except Exception as e:
print(e)
return False
if __name__=='__main__':
main()
フォルダのパスを変更する方は下記2行を変更ください
objfolder=’C:/thicken-line/before’ #ここのパスを任意のフォルダパスに書き換えてください。
outfolder=’C:/thicken-line/after’ #ここのパスを任意のフォルダパスに書き換えてください。
処理する画像ファイルの拡張子が決まっている場合は下記のコードの拡張子の部分を変更ください。
img_file_list=glob.glob(objfolder+’/*.*‘) #変換したい元のファイル拡張子が決まっている場合には.tifのように変更
膨張処理プログラムの内容を解説しておきます。
kernel =np.ones((5,5),np.uint8) #膨張するパラメータ設定
上記コードで(5,5)の部分は1回の処理でどれくらい膨張させるかのパラメータです。
pythonプログラム実行後、beforフォルダに生成されたファイルの出来栄えを確認して、もっと太くしたい場合には(7,7)のように大きい数字に変更して再度確認してみてください。
erosion=cv2.erode(img,kernel,iterations=1) #膨張実行
上記コードは膨張の実行コードで、iterationsは膨張処理の適応回数です。
iterationsの数字が大きいほど線が太くなります。
(5,5)とiterationsの組み合わせで線の太さの調整をすることができます。
pythonプログラムの実行
Visual Studio Code上でデバッグ実行するとエラーが発生した場合に原因追求しやすいのですが、今回はコマンドプロンプト上での実行方法を説明します。
コマンドプロンプトの起動はWindowsタスクバーにある検索窓にcmdと入力すると候補として表示されますので「開く」を選択してコマンドプロンプトを起動してください。
c:\>コマンドを入力するところにカーソルを移動してコピーして作ったpythonファイルを実行してください。(赤ラインマークしているフォルダとファイル名はあなたが用意したフォルダパスとファイル名を入力してください)
python.exe c:\thicken-line\thicken-line.py
ライブラリのインポートエラーが発生した場合には、ライブラリのpip installをお願いします。
注意
OpenCVの膨張は白黒の画像に対して行う処理です。
このプログラムでは画像が白黒であることを前提でプログラムを記述しています。
ファイル形式によってはエラーが発生するかもしれません。
その場合にはファイルを読み込んで、ファイル形式を変換するなどの処理を盛り込むように改造ください。
画像ファイルでない(例:エクセルファイル)などの場合は読み込んで画像ファイルでなかった場合、処理が飛ばされてファイルが出力されないように対策してあります。
おわりに
どうでしたでしょうか?
OpenCVの膨張処理自体は2行のコードで実行することができます。
逆に線を細くするように改造したり、画像に対して別のOpenCV処理を実行するように改造することもできますので、自分で試してみてください。
OpenCVの仕様や使用方法がを日本語訳されているサイトはこちらです。
ほかにもpythonを使った記事もありますので読んでくださいね。
コメント