ピクセルごとの色相をEXCELで計算

# ピクセルごとの色相をEXCELで計算し出力する

## 発端
何かそんなツールがありそうなのですが、見つけられなかったのでやってみました。画像で使われている色の偏りを調べたかったからです。今回はあくまでも色相だけを見ています。

## RGB値の取得
RGB値を1ピクセル毎に保存するツールを探したのですが、GIMPを使って.ppm形式だとよさそうでした。

#### GIMPについて
https://www.gimp.org/

#### ppmファイルについて
http://www.openspc2.org/format/PPM/

画像をエクスポート＞PPM形式で出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/ec14ad80-1d91-e4a0-d06d-41c9b45a3e4c.png)


## ppmファイルをテキストファイルに変換する
ppmのファイルを選択し、拡張子を.txtにします(拡張子を表示していない場合はOSの設定で変更してください）
txtに変換したファイルを開き、最初の3行ないし4行程度を削除します。空き行が無い方がいいかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/3453f4a7-c07b-ea84-c05b-726aa156b199.png)
画像は削除した部分をハイライトしています。
削除後、保存します。
GIMPの場合は上から4行を削除しました。

## 内容を整形する
正規表現で検索置換できるツールをつかってさきほど保存したファイルをひらきます。
MacですのでCotEditorを使っています。
このデータは219がR、233がGと3つの数字で1ピクセルとなっています。
まず、改行をカンマに変更します。
検索ワードに　\n（改行）を入力、置換ワードに , （カンマ）を入力し置換します。
（変換前）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/53edf108-ee2a-8e7b-6175-444900490df6.png)

（変換後）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/2cc724cb-b8b4-3f52-7048-adfceb14b65b.png)
R,G,B,R,G,B......とデータが並んでいます。

これではエクセルで一気に変換できませんので、
R,G,B,
R,G,B,
R,G,B,
と3つ区切りにします。

検索置換で、検索ワードに (.+?,)(.+?,)(.+?,)　を、置換ワードに
`$1$2$3\n`
を入れて置換します。
（変換前）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/fdbd9a14-a304-af1b-0572-5b5a98800023.png)

（変換後）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/88139d7d-983a-6488-a092-e4f199ca7508.png)

これで、左からR,G,B,（改行）のデータになりました。
ここでファイルを保存します。
ホソンしたファイルの拡張子を.csvに変換します。これでEXCELで読み込む準備ができました。

## EXCELで開く
保存したCSVファイルをEXCELで開きます。
1行目に行を追加し、A1セルにR、B1セルにG、C1セルにBと入力しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/10c98992-2794-a321-ce45-f0a4ce56706c.png)

RGBからHSBなどへの変換公式は検索してみてください。
まず最大値を取り出します。 =MAX(A2:C2)
次に最小値を取り出します。 =MIN(A2:C2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/1d08cefc-441c-4f7e-4649-3145124281b4.png)


次にRGBのうち、最大となったセルがRかGかBかを判定します。　EXCELのINDEXやMATCH関数を使います。
=INDEX($A$1:$C$1,0,MATCH(MAX($A2:$C2),$A2:$C2,0))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/32785df3-40cd-e5ba-9306-f3bfa188d542.png)


最大の値がRかGかBかで変わりますので、IFを使ってHの値を計算します。
=IF(AND(EXACT(A2:C2,C2)),0,IF(COUNTIF(F2,"R"),60*(B2-C2)/(D2-E2),IF(COUNTIF(F2,"G"),60*(C2-A2)/(D2-E2)+120,IF(COUNTIF(F2,"B"),60*(A2-B2)/(D2-E2)+240,))))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/f30eb898-bb7e-812d-9078-3bbf0e267d31.png)

負の値の場合を計算します。
=IF(G2<0,(G2+360),G2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/b1e3711f-a5c5-2cf8-d1e0-1ead6d7086b1.png)

今回はおおかまな割合を見たいので、30度ずつに分割します。
=IF(OR(H2>344,H2<15),0,IF(AND(H2>14,H2<45),30,IF(AND(H2>44,H2<75),60,IF(AND(H2>74,H2<105),90,IF(AND(H2>104,H2<135),120,IF(AND(H2>134,H2<165),150,IF(AND(H2>164,H2<195),180,IF(AND(H2>194,H2<225),210,IF(AND(H2>224,H2<255),240,IF(AND(H2>254,H2<285),270,IF(AND(H2>284,H2<315),300,IF(AND(H2>314,H2<345),330))))))))))))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/3f503fb2-4470-d28f-ccde-8d1e475b3e51.png)

30度ずつに分けたピクセル数をカウントします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/c592e8ee-c380-d881-57a2-66d02662112e.png)

円グラフにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/7d5384d8-0c74-9f5a-696c-a2dc43a1c431.png)
210度（195〜224度）が56%と多いですね。

元画像（職場なのでぼかしてます）はこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/1156358d-8ac8-77e0-eefd-55e59c4d3d4b.png)



おつかれさまでした。