質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4185閲覧

RGBからHSVへの変換結果がC#とpythonで異なる

WEjpon

総合スコア88

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2018/08/22 09:33

RGBからHSVへの変換について、C#(.NET Framework)とpython(OpenCV)で結果が異なります。
理由をご教授いただけないでしょうか。
また、どちらが正しいでしょうか。

RGB画像は256x256で左上を原点として、画像1はR,G,B = 0,x,y、画像2はR,G,B = 255,x,yです。
各画像において上段がC#、下段がpythonで変換しました。

<画像1>
イメージ説明

<画像2>
イメージ説明

それぞれのソースコードです。

C#

1int r = 0; // 画像2では255 2int size = 256; 3 4// RGB画像 5Bitmap bmpRgb = new Bitmap(size, size); 6 7for (int x = 0; x < size; x++) 8{ 9 for (int y = 0; y < size; y++) 10 { 11 Color color = Color.FromArgb(r, x, y); 12 bmpRgb.SetPixel(x, y, color); 13 } 14} 15pictureBoxRgb.Image = bmpRgb; 16bmpRgb.Save("test.png"); # ここで作成した画像をpythonでRead 17 18// HSV画像 19Bitmap bmpH = new Bitmap(size, size); 20Bitmap bmpS = new Bitmap(size, size); 21Bitmap bmpV = new Bitmap(size, size); 22 23for (int x = 0; x < size; x++) 24{ 25 for (int y = 0; y < size; y++) 26 { 27 Color color = bmpRgb.GetPixel(x, y); 28 float h, s, v; 29 h = color.GetHue() * 179 / 360; 30 s = color.GetSaturation() * 255; 31 v = color.GetBrightness() * 255; 32 33 bmpH.SetPixel(x, y, Color.FromArgb((int)h, (int)h, (int)h)); 34 bmpS.SetPixel(x, y, Color.FromArgb((int)s, (int)s, (int)s)); 35 bmpV.SetPixel(x, y, Color.FromArgb((int)v, (int)v, (int)v)); 36 } 37}

python

1bgr = cv2.imread("test.png") # BGRでRead。C#で作成した画像 2hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV) # BGR->HSV 3 4cv2.imwrite('hsv_h.png', hsv[:,:,0]) 5cv2.imwrite('hsv_s.png', hsv[:,:,1]) 6cv2.imwrite('hsv_v.png', hsv[:,:,2])
atata0319👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

.NETのドキュメントにはHSBとあるのですが、Colorのソースを読む限りHLSです。
.NETのバグでIssueも上がってますが、、、影響が大きいので直せないでしょうね、、、

OpenCVのはちゃんとHSBで黒の時にSaturationが0に収束しないので円柱状のモデルみたいですね。
OpenCVのほうがHSBとして正しいと思います

投稿2018/08/22 14:50

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WEjpon

2018/08/23 02:16

ソースまで示していただきありがとうございます。 HSB、HLSという単語すら知らずに質問しておりました。 Wikipediaの式を元に実装したところ(画像1、2のみの確認ですが) ご指摘の通りColorはHLSの円柱モデル、OpenCVはHSBの円柱モデル となり、納得できました。
guest

0

一言にHSV, HSB, HSL表色系といっても、(少なくとも私が学生時代に調査した日本語の文献の中では)文献によって定義は異なります。なので、どちらが正しいとは言えません。単にOpenCVで採用している変換式と、C# で採用している変換式が異なるというだけです。

というわけで、toki_td さんの回答にリンクされている issue では「Wikipedia と違うから」という理由でバグ報告されていますが、それだけでは問題とは言えません。問題があるとすれば、変換式がドキュメントにちゃんと書いていないことです。

投稿2018/08/22 09:51

編集2018/08/22 23:09
yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WEjpon

2018/08/23 02:26

回答ありがとうございます。 文献により定義が異なるというのは奥深い世界ですね。 Wikipediaの定義が確実に正しいのかはわかりませんが、 実装してみたところご指摘の通りOpenCVとC#では変換式が異なるようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問