【画像処理】PythonとOpenCVを用いたエッジ検出でぷーさんを丸裸に！

#はじめに
はじめまして！大学で機械学習や深層学習を専門に勉強しているヨシキと申します！
今回はPythonとOpenCVを用いたエッジ検出ついて解説していきたいと思います。（自分の理解を深めるためでもあります笑）
とりあえずPythonとかって何ができんねんと思っている方にも楽しんで理解していただけるよう尽力します！


#そもそもエッジ検出って何？
画像処理の世界でエッジというのは、画像内で明るさが急激に変化する箇所という意味合いがありますが、いまいちピンときませんよね。普段皆さんがエッジと聞いてどういう意味を思い浮かべるでしょうか？
縁とか輪郭とか思い浮かべた人は正解です！
つまりエッジ検出とは画像処理をしやすくするため、輪郭という特徴のみを抽出する技術なんです！

参考文献
<https://it-mint.com/2018/11/05/feature-value-in-image-recognition-whats-edge-detection-and-spatial-filter-1839.html>

#環境
今回は、皆さんにも実際に手を動かしてプログラムを動かしてほしいと思ったので、ローカルではなくGoogleドライブとGoogle Colaboratoryを使用して実装していきたいと思います。
メリットとしては、pipなどでライブラリをインストールすることなく使用できるといった点で利便性が高いので選択しました。

##環境作り
１．まずはgoogleアカウントを作成しましょう！（すでに持っている方はそれを使用しても構いません）できましたらgoogleドライブにアクセスしてログインしましょう。

２．アクセス出来たら左上の新規のボタンからフォルダという項目を選択しましょう。
クリックすると名前入力欄が出てくると思います。なんでもいいですが、私はEdgeというフォルダ名にしました！

３．そうすると、マイドライブ内にフォルダができたと思います。そうしたら、そこにアクセスして、もう一度、新規ボタンからImagesとSrcというフォルダを作成しましょう。Imagesには、エッジ検出したい画像をアップしたり、エッジ検出後の画像をアップしたりします。
Srcにはソースコードを書いていきます。

4.さて、そろそろ最後です！Imagesには、エッジ検出したい画像を入れておきましょう！新規ボタンのファイルのアップロードからできます。
Srcでは、新規から一番下のその他を選んでGoogle Colaboratoryを選択しましょう。（もしなければアプリを追加から検索してインストールしましょう！）選択したら、エディタの画面に遷移するはずです。

5.最後に、Google Colaboratoryの仕様についてです。
・Google Colaboratoryは30分程度で接続が切れてしまい、切れてしまうと再接続しなくてはならないので注意です。（ソースコードが消えるとかはないです笑）
・接続するときに以下のようにコードを求められるので、URLにアクセスしてコードを取得しましょう！
![messageImage_1605587862536.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670831/5a0513b7-8c12-b35e-5d2e-e987e25e54af.jpeg)

・わかりやすさのため名前はUntitled.ipynbから変更しておきましょう。
・保存はファイルの欄からできます。こまめにしておきましょう！

#ソースコード
全体的にオブジェクト指向的な設計を意識しました。
基本的なコード解説はコメントアウトに残しておきました。

```python
import cv2

#------------Setting------------#
#Setting for using google drive
from google import colab
colab.drive.mount('/content/gdrive')

#Directory setting
b_dir='gdrive/My Drive/Edge/' #Setting working directory

#Experiment setting (Parameter setting for canny operator)
min_val=100
max_val=150

#Imput file setting
t_dir=b_dir+'Images/'
data='ぷーさん'
ext='.JPG'
org_name=t_dir+data+ext

#Output file setting
canny_name=t_dir+data+'_Canny _'+str(min_val)+'_'+str(max_val)+ext

#------------Image processing------------#

#Image read
org=cv2.imread(org_name)
if org is None:
  print('\n**********************************************************\n')
  print(org_name+' cannot be read\n')
  print('************************************************************\n')
else:
  #Grayscale image generation
  gray=cv2.cvtColor(org,cv2.COLOR_BGR2GRAY)

  #Apply image operator
  canny=cv2.Canny(gray,min_val,max_val)

  #Save image
  cv2.imwrite(canny_name,canny)
```

#解説（注意事項）
まず、以下では、OpenCVのインポートとディレクトリの設定をしています。
#####ここで1つ注意点があります。
最終行のEdgeというところです。ここは、各自最初に設定していただいたフォルダの名前を参照しているので、皆さんが最初に作成したフォルダの名前に書き換えておきましょう。

```python
import cv2

#------------Setting------------#
#Setting for using google drive
from google import colab
colab.drive.mount('/content/gdrive')

#Directory setting
b_dir='gdrive/My Drive/Edge/' #Setting working directory
```
次に以下では、パラメータ設定と画像ファイルの設定、あと出力画像のファイルの設定をしています。
#####ここに関しては、2つ注意点があります！
1点目はパラメータについてです。今回はエッジ検出の方法にキャニー法というものを使用しています。（この記事ではキャニー法に関しての説明は割愛します。）このパラメータは、私がこの値でうまくエッジをとってこれるだろうと設定した値なので、皆さんのほうで自由に変更してもらって構いません。
2点目は画像ファイルの設定についてです。こちらは、皆さんのほうでImagesフォルダに画像をアップロードしていただいたと思うので、その画像の拡張子より前をdataに、拡張子をextに格納するようにしてください。

```python
#Experiment setting (Parameter setting for canny operator)
min_val=100
max_val=150

#Imput file setting
t_dir=b_dir+'Images/'
data='ぷーさん'
ext='.JPG'
org_name=t_dir+data+ext

#Output file setting
canny_name=t_dir+data+'_Canny _'+str(min_val)+'_'+str(max_val)+ext

```

#出力結果
Mounted at /content/gdrive
このように出力されれば成功です！
マイドライブのImagesを確認してみてください。エッジ検出された画像が出力されているはずです。
ではタイトルにもある通り私は、プロフィール画像のぷーさんをエッジ検出しましたので、結果をご覧ください。
#####元画像ぷーさん
![ぷーさん.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670831/88644e8c-5c29-3a55-fe7a-11885a3b95e3.jpeg)

#####エッジ検出ぷーさん
![ぷーさん_Canny _100_150.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670831/088fa467-ca7a-4b0e-94f6-85d592756ef2.jpeg)

し、しぶいぜ、、、

#最後に

お疲れ様です！
ここまで付き合ってくださった方がいればうれしい限りです笑
また、この記事がきっかけでPythonってこんなことできるのかと興味を持っていただけたら幸いです。初投稿なのでなるべく丁寧にやったつもりですが、なにか至らぬ点や疑問点、ミスがありましたらコメントください。これからも機械学習などの記事をたくさん書いていくつもりなので良かったらフォローお願いします！