5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

画像処理 その2

1 :デフォルトの名無しさん:03/06/02 18:10
前スレ

画像処理
http://pc2.2ch.net/test/read.cgi/tech/992671330/l50


2 :デフォルトの名無しさん:03/06/02 18:10
今日は糞スレが大量発生するねぇ

3 :デフォルトの名無しさん:03/06/02 19:00

      /⌒ヽ   コラ―――!!!
     /  =゚ω゚)=
     ( ヽノ
      ノ>ノ  ヒタヒタ
. 三  しU


4 :デフォルトの名無しさん:03/06/02 19:09

      /⌒ヽ   コラ―――!!!
     /  =゚ω゚)=
     ( ヽノ
      ノ>ノ  ヒタヒタ
. 三  しU


5 :デフォルトの名無しさん:03/06/02 19:09

      /⌒ヽ   コラ―――!!!
     /  =゚ω゚)=
     ( ヽノ
      ノ>ノ  ヒタヒタ 
. 三  しU


6 :デフォルトの名無しさん:03/06/02 20:09

      /⌒ヽ   コラ―――!!!
     /  =゚ω゚)=
     ( ヽノ
      ノ>ノ  ヒタヒタ 
. 三  しU


7 :デフォルトの名無しさん:03/06/02 20:10

      /⌒ヽ   コラ―――!!!
     /  =゚ω゚)=
     ( ヽノ
      ノ>ノ  ヒタヒタ 
. 三  しU


8 :デフォルトの名無しさん:03/06/02 20:25

      /⌒ヽ   コラ―――!!!
     /  =゚ω゚)=
     ( ヽノ
      ノ>ノ  ヒタヒタ 
. 三  しU


9 :デフォルトの名無しさん:03/06/02 22:26
>>1

テンプレも参考リンクもなしに新スレ立てんでくれ。
前スレで話しあってから立て直すように。


10 :デフォルトの名無しさん:03/06/03 20:44
別にここでいいよ

11 :デフォルトの名無しさん:03/06/07 22:23
       画像処理 その2

・画像処理について素人同士で大激論
・初学者の質問に対してやさしく(的を外れた)解答を与える
・その道の玄人も大歓迎


/*********************** 始動 ***********************/

12 :テンプレ:03/06/12 14:54
前スレでも、よく話題に上ったので・・・

Q:カラー画像をグレースケールに変換するには?

A:グレースケールへの変換には、完全な解答はありません。
一般には、下式が用いられるようです。

グレースケール = 0.299R + 0.587G + 0.114B

ちなみに、(R+G+B)/3はオススメできません

13 :デフォルトの名無しさん:03/06/14 12:02
WindowsのColorDialog([色の設定]ダイアログ ボックス)は今ひとつなんで

左上が 真白 右下が黒 のパレットを作ろうと思うのです
xx ,yy をx,y座標として

y:=1-(xx+yy)/2;   //輝度
x:=(1+(xx-yy))/2*360;//色相

で y=0.5 の時に彩度が最大 としたいのですが 旨い計算式が思いつきません

14 :13:03/06/14 12:12
とりあえず、色の分離は

y:=1-(xx+yy)/2; //輝度
t:=1-2*abs(y-0.5);
if t<>0 then x:=(1+(xx-yy)/t)/2*3;//色
n:=Trunc(x);
x:=x-n;
case n of
0: begin r:= x ; g:= 1-x; b:= 0 ; end;
1: begin r:= 1-x ; g:= 0 ; b:= x ; end;
2: begin r:= 0 ; g:= x ; b:=1-x ; end;
end;


15 :デフォルトの名無しさん:03/06/14 12:40
Linuxで画面にプロットするところから優しく教えてくれるサイトはありませんか?

16 :デフォルトの名無しさん:03/06/14 12:41
gtk使え。

17 :デフォルトの名無しさん:03/06/14 14:22
>>15

Java2使え。


18 :_:03/06/14 14:30
http://homepage.mac.com/hiroyuki44/

19 :デフォルトの名無しさん:03/06/14 14:50
>>15
Kylix使え。

20 :デフォルトの名無しさん:03/06/14 14:53
>>13
何をしたいのかよく分からんが
YHS輝度色相彩度やRGBと座標X,Yの対応はR^3⇔R^2で連続には
出来ないだろう。

21 :13:03/06/14 18:23
>>20
うんそうみたいだな
色空間を5.5.4 bitに別けて
32*32*16=16384 128*128 だから、これをスムーズに並べられたらなあとは思うんだけど。



22 :デフォルトの名無しさん:03/06/14 22:06
トラックボールを転がすようなインターフェースができたら面白いと思うけどね。
全部の色を一度に見られないというデメリットがあるが……

23 :デフォルトの名無しさん:03/06/15 14:46
>>21
色空間をペアノ曲線に乗せてみた。全くの無意味だった
http://up.isp.2ch.net/up/d6a1398874fa.jpg

やはりPainterのパレットの類(一つのパラメータは独立させる)のほうが
まともに使えると思う

24 :13:03/06/15 19:35
>>23
でも一般の人は画面上に全部の色があってそこからひらって来るイメージの方が判り易いかもしれないと思ってさ、

Adobeのツールのパレットが上が白で下が黒で連続した感じで色が並んでる。
それで、斜め方向に明るい順に並べて出来るだけ色が連続するようにしたらどうかなと思ったんだけど
数学的に解くのは難しいみたいだ。
8x8x4=256色なら 16x16に手作業で順におけばそれなりにおけるんだけどねえ

25 :デフォルトの名無しさん:03/06/16 23:39
>>24
Photoshopのパレットはおそらく彩度を固定していて
彩度の低い灰色などは選べないと思う。

26 :葉っぱふみふみ:03/06/18 00:33
mpeg2の規格書ってどうやって手に入れるかしってますか?
フリーじゃない。。?もしかして。。

27 :デフォルトの名無しさん:03/06/18 01:04
どうやらそのようだ
http://mpeg.telecomitalialab.com/standards/mpeg-2/mpeg-2.htm

どれもisoで買うようにリンクされている

28 :デフォルトの名無しさん:03/06/18 21:03
>>026
ITU から無料で入手可能 ITU-T H.262 / ITU-T H.222 というのがそれ
MPEG-2 Video と MPEG-2 System だけだけど、多分 26 の言う MPEG-2
はこの二つで足りるはず。

29 :葉っぱふみふみ:03/06/18 23:50
>>27さん
>>28さん
ありがとうです。(TT)
探してみます。

30 :葉っぱふみふみ:03/06/19 00:04
て訳でみつかりますた。

ttp://ecs.itu.ch/cgi-bin/dms-ebookshop/

で登録するとお一人様、年三回ダウンロードが無料っす。


31 :デフォルトの名無しさん:03/06/19 00:34
年3回…微妙にケチだな…

32 :デフォルトの名無しさん:03/06/19 10:43
QRコード(二次元バーコード)をデコードするライブラリってありませんか?
さらに,カメラで撮影した画像から手軽に内容を認識できれば面白そうだが.

QRコードの解説
www.denso.co.jp/EAP/qrcode/index-qr.html



33 :デフォルトの名無しさん:03/06/20 01:47
現在、DirectShowをつかってdvカメラから白黒動画をグラバに読み込んでます。
この画像をリアルタイムで2値化したいのですが、どのようにすればいいでしょうか?
背景を一色でその前に人をたたせて 人 背景部分を分離したいのです。よろしくお願いします。

34 :デフォルトの名無しさん:03/06/20 14:13
背景だけの取り込みは出来るの? 出来るなら差分をマスクにすれば・・・

どんなシチュエーションを想定してるの?

35 :デフォルトの名無しさん:03/06/20 20:16
最終的な形としては
ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
このテキストレインのような状態を目指しています。
4月からプログラムを始めてやっとスムーズに取り込めるようになり、方法としてはDirectShowをつかってdvカメラから白黒動画をグラバに読み込んでます。
人と背景の境をエッジ検出でやろうと思ったのですが、2値化して分けたほうがいいのではないかと思いチャレンジしています。
リアルタイム処理で2値化して境の部分であたり判定を出そうとしているのですが、見当違いでしょうか?
美大系の大学でこういう事を専門にしている先生がいないために、もしかしたらものすごく見当違いのことをしているのじゃないかと思い、アドバイスいただけるとうれしいです。
よろしくお願いします。

36 :デフォルトの名無しさん:03/06/20 21:03
(´・ω・`)ノ こんにちは。

浮動小数点を使わずに、
任意の二点間に直線を引きたいのれす。

もちろんlineとかは使えません。

使えるのはPSETなどの1ドット描画だけれす。

条件を満たす高速なアルゴリズムがあったら教えて欲しいのれす。



37 :デフォルトの名無しさん:03/06/20 21:10
>>36
DDA Bresenham で検索したら?

38 :36:03/06/20 21:31
>>37
(´・ω・`)ノ すぐに実現できました。
ありがちょう!!


39 :デフォルトの名無しさん:03/06/20 21:58
>35
リアルタイムで白黒画像なら、2値化して境界の判定をするオーバーヘッドは
大きい様な気がする。 2値化の精度も問題だろうし・・・

特定のカラープレーン1枚を使って、マスクがあればマスク、無ければ直前の
画像との差分を、境界判定の処理にまわした方が良いと思うな。

「マスク」って背景のみ映ってる画像の事ね。

40 :デフォルトの名無しさん:03/06/20 22:07
2値化が旨くゆくならそりゃ成功だろうけど

自分なら背景に加工するけどね。 たとえば

案1、背景を点滅させる
  点滅してる部分をマスクパターンとして抜けば人物が残る

案2、背景に縞模様を写す
  辺より縞模様を追跡して、分岐があった個所を繋げば輪郭パターンの出来上がり

41 :デフォルトの名無しさん:03/06/20 22:58
クロマキーでは駄目なのか

42 :デフォルトの名無しさん:03/06/20 23:10
なるほど2値化はわりとむずかしいのでしょうか。

いまとても参考にしているHPがあり
ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
この中では差分で判定しているのですが、その差分判定の
s = s + (buf2[i]= fabs( buffer[i] - buf3[i]
で、とても時間がかかってしまいます。
クロマキー処理ということはあるひとつの色をすべて抜くということですよね。
あした大きな本屋にでもいってその情報も調べてみようと思います。
他にも気が付いたことがあったらぜひお願いします。

43 :デフォルトの名無しさん:03/06/21 00:42
白黒画像なんだから、クロマキーは使えないでしょ。
妥協案として、背景を真っ白とか真っ黒なら、有りか・・・

点滅してても、画像取り込みの段階で(略

2値化は難しい。 決まればキレイだがそうでないと、何見てるんだか判らん。

その式は、複数行に分けて、コンパイラの最適化に期待。
出来ればMMX命令を使ってアセンブラ化が良いぞ。

44 :デフォルトの名無しさん:03/06/21 06:27
点滅を取り込みに同期してやればいい。
232Cかプリンタポートで取り込み毎に on/offを反転し
取り込んだ映像で1ピクセル単位に輝度差を調べれば良いから簡単だ

45 :デフォルトの名無しさん:03/06/21 16:03
減色とか、RGB→YCbCr変換とか、VRAMの効率的な扱い方とか
もろもろの基本的な画像処理がわかる書籍について、
知っている人がいたら教えてクレクレタコラ。

46 :デフォルトの名無しさん:03/06/21 17:07
>>45
ネット上にいくらでもあるような


47 :デフォルトの名無しさん:03/06/21 17:21
点時と滅時の差分か? なら、どちらかにレベルを合わせて(点時を255とか、滅時を0)
判定した方が、処理が早いと思うが。

ポートを見に行ってたのでは、時間が掛かり過ぎるよ。

>45
VRAMの効率的な扱い方って、処理系に依存するから、自分で探すしかないよ。

48 :デフォルトの名無しさん:03/06/22 18:07
>>45
そういうのはゲームプログラミングの関係で多いよね。

49 :デフォルトの名無しさん:03/06/22 20:03
>>47
ポートを見るとか関係ないよ。

言ってるのは、232CのRTSとかの出力で人物背景のライトをON/OFF出来るようにしておいて、
ライトオンで一度 取り込み -->A
ライトオフで一度 取り込み--> B

A-Bのデータを作れば背景が抜けるという意味さ

50 :デフォルトの名無しさん:03/06/23 00:45
>49
ゴメン、意味は判ってるんだ。 ただ、セントロやシリアルのポートをいじるのは
画像の収集(フレームの取り込み)に比べて時間がかかり過ぎる事が言いたかった。

それから、その方法では、人物が画面内に静止したら、まずくないか?

51 :デフォルトの名無しさん:03/06/23 06:18
だから、取り込み って書いた部分は1画面取り込みの事だからさ

この方法は人物が静止してたら問題ない。逆に動いていた時に差分が
出てしまい、その動いてたときに間違えないような設定値を探さないといけない。


52 :デフォルトの名無しさん:03/06/23 17:41
WebProgから流れてきました。Perl⇒サムネイル画像作成に
ついての質問をさせていただきます。前スレを読んだのですが、
私の状況と微妙に違ったため、解決することが出来ませんでした。

(状況)
利用しているサーバではGD,PerlMagickがインストールされていません。
(欲しい情報)
・インストール無しで使える、画像縮小のモジュール
・画像を縮小するための具体的なアルゴリズム
・インストールが必要なGD,PerlMagickモジュールの改造方法
・前スレで記載されていたjpegの展開⇒サイズ変更⇒圧縮について
のような情報を求めています。
(jpeg/png/gifなどについて行いたいです。(1つしか出来なくても構いません))

自分でJpegの構成を調べて処理することは最後の手段としたいっす。
どうかよろしくお願いします。

53 :学生:03/06/23 23:51
しばらくぶりです。今日いろいろ図書館や先生に質問などでうごいてみました。
なかなか、難しいです。先生から2値化 エッジ検出 動き差分習得などのアドバイスを
いただいたのでそれらを試してみたいと思います。
ただ先生は、わからないけど。。。じゃない?という答えだったので不安でいっぱいなのですが。
rc232cポートなどつかういいんですかね?ただ、そうなるとまたハードルが高く。。
アセンブラ化も、、大変そうですね、がんばってみます。ありがとうございました。
また、なにかあったら質問にきます。ありがとうございました。

54 :52:03/06/24 03:25
解決してしまいました。申し訳ありません。

55 :社会人:03/06/25 16:06
 ベクタで、2DのDXFファイルを、解像度指定してラスタライズしたいです。

 出力は最終的にはBMPあたりなんですが、それはいいとして、とりあえず
DXFをラスタライズする際に利用可能な、そこそこ使いやすいライブラリ
(有償/無償問わんです)って何かないでしょか?

 アプリだと、要はコンバートなので色々見つかるんですが、ライブラリだ
となかなか見当たらなくて。

 呼び出し側の言語としては、Javaか、C/C++のどちらか(現時点ではどち
らでもいいです)で、ただ、C/C++ならWindows上で利用できることが前提に
なりそうです。

 よりふさわしいスレ/板があったら、それでもよいので教えてくださいまし。



56 :55:03/06/25 16:07
>>55

 書き方が変だったかも

> ベクタで、2DのDXFファイルを、解像度指定してラスタライズしたいです。

 ↓

> ベクターデータのDXFファイル(2D)を、解像度指定してラスタライズしたいです。

57 :デフォルトの名無しさん:03/06/25 16:12
DXFのラスタライズなら、それこそWindowsAPIだけで十分な気がするが?
面倒なのはスプラインくらいだろ

58 :55:03/06/25 16:33
> DXFのラスタライズなら、それこそWindowsAPIだけで十分な気がするが?
> 面倒なのはスプラインくらいだろ

 いや、全部のDXFエレメントをレンダリングするのを自力で実装する費用は
出ない案件で、上司から、

「市販でコンバートするライブラリとかあるんじゃないの?」

と言われていたものの、探してみると意外とみつからない、というのが実情
でして…。

59 :デフォルトの名無しさん:03/06/25 16:43
http://my.vector.co.jp/servlet/System.FileDownload/download/ftp/0/287703/pack/win95/game/table/pachinko/majomika.lzh

http://my.vector.co.jp/servlet/System.FileDownload/download/ftp/0/281853/pack/win95/game/table/pachinko/SUTING.LZH

http://www5b.biglobe.ne.jp/~ryo-kyo/

60 :デフォルトの名無しさん:03/06/25 20:38
>>58
コマンドライン形式のコンバータを呼び出すのではダメなの?
数十万円程度で入手できると思うが

ただ、AutoCADの表示に完全に忠実なラスタライズをしている製品
は、少ないので注意。特にPOLYLINEやMTEXT。


61 :55:03/06/27 11:11
>>60
やはり、とりあえずはコマンドラインタイプなんすね。
KDコンバートとかいうソフトは見つけました。
これをベースに検討してみます。

62 :デフォルトの名無しさん:03/07/01 04:58
tiftのヘッダにあるタグに独自のタグを追加したいんですけど、
どの値が自由に使ってよいか知ってる人がいれば教えてください。

63 :デフォルトの名無しさん:03/07/02 21:13
ビットマップ(DIB)をWin32APIのStretchDIBits()のように任意倍率で縦横に拡大させたいのですが
どんな方法がありますか?
できるだけ高速なものがいいです。

64 :デフォルトの名無しさん:03/07/02 22:17
>>63 ブレゼンハムとか?

65 :デフォルトの名無しさん:03/07/02 22:19
すいません、ちょっと教えてください。
今linuxでlibtiffってライブラリーを使ってC言語で
グレースケールの画像の各ピクセルの輝度を取り出したいんですが
どうもよくわかりません。

ここにあるTIFFReadScanlineって関数を使ってやれば出来そうだなとは思うんですが。
http://www.libtiff.org/man/TIFFReadScanline.3t.html
開いた画像を一行ずつスキャンしてバッファーに解凍するって言うんですけど
このバッファに入った値をどうすればピクセル毎の輝度が得られるかさっぱりわからないんです。
文字列をgets()で開いた場合に、配列の各要素に一文字ずつ格納されるのとはどうも違うようで
イメージが掴めません。

どなたかわかる方がいらっしゃったらよろしくお願いします。

66 :デフォルトの名無しさん:03/07/02 22:20
>>64
プレゼンハムってどんなプレゼン?

67 :デフォルトの名無しさん:03/07/03 11:36
>>65
輝度はピクセルのRGB値から簡単に求めることができる。
公式は「0.299f * R + 0.587f * G + 0.114f * B」

68 :とも:03/07/03 11:46
みてね〜♪
http://s-rf9.free-city.net/page003.html

69 :デフォルトの名無しさん:03/07/03 13:13
>>63

StretchDIBits()した結果のデバイスコンテキストをDIBなりDIBSectionなりに取得。


70 :  :03/07/03 15:59
反射率分布図を使った三次元形状復元について質問があるんですけど
光を受ける面が傾いていたら暗くみえて,傾いていない(勾配がゼロ)
の場合明るく見えますよね?
それとは少し違うんですけど,三次元の形状でなめらかな特性をもつ
物体の「なめらかさ」を定義したい場合
(px^2 + py^2) + (qx^2 + qy^2)がそのなめらかさらしいのですが
いったいなぜそうなるんですか?
ちなみにp,q というのはその三次元形状の物体の面の勾配です。


71 :デフォルトの名無しさん:03/07/03 16:06
どなたかわかる方がいらっしゃればお願いします。
CADファイルのDXFをメタファイルに変換をしているのですが、
ブロックの挿入で
x方向・y方向・z方向の尺度と回転角度って項目がデータにあるんですが
これはブロックの何を基準に回転または拡大・縮小をかけているんでしょう?
始点?終点?中心点?
どなたかわかる方がいれば教えてください

72 :65:03/07/03 20:40
>>67
アドバイスして頂いてありがとうございます。
でも、今取り組んでいるのはグレースケールなんです。
それと私がわからない点は、一行分バッファに取り込んでから
どうすれば各ピクセル毎の輝度が得られるかって事なんです。
理解し難い文章ですみません。

73 :デフォルトの名無しさん:03/07/03 21:23
すいません!
TransparentBltってだめなのwin98だけ?
win98seからはok?

74 :デフォルトの名無しさん:03/07/04 00:34
TransparentBltってなんだ?
Win32APIには無いようだが。もっともWin32APIのマニュアルには
そういう関数がサンプルプログラムで入ってはいるが

75 :デフォルトの名無しさん:03/07/04 08:05
>>73
だめ、2000かXP。
↓のスレで聞いた方が良かったな
Win32API 質問箱 Build12
http://pc2.2ch.net/test/read.cgi/tech/1056033645/

>>74
>Win32APIには無いようだが。
なにをもって無いと、言ってるのか分からないが・・・
http://www.microsoft.com/japan/msdn/library/ja/jpgdi/html/_win32_transparentblt.asp



76 :デフォルトの名無しさん:03/07/04 10:00
>>65
tiffはよくわからんがbmpにしてから
http://asapc1.cc.it-hiroshima.ac.jp/stu/c02/c02.html
みたいにするのはだめか?

77 :_:03/07/04 10:06
http://homepage.mac.com/hiroyuki44/hankaku02.html

78 :73:03/07/04 12:04
>>75 ありがとう!
せこせことマスク処理しますわ。

79 :デフォルトの名無しさん:03/07/04 13:59
Xlibを使ったプログラムを作っています。
ウインドウが他のウインドウで隠されても描画したものを保持したいんですが、
XSetWindowAttributes window_attr;

window_attr.backing_store = Always;
window_attr.save_under = True;
XChangeWindowAttributes(display, window, CWBackingStore|CWSaveUnder, &window_attr);
としても、消えてしまいます。
どうしたら描画内容を保持できるのでしょうか。

80 ::03/07/04 14:51
>>32
QRコードライブラリ完成したでつ。
そこそこの値段でうるでつよ。
CとJavaね。

81 :デフォルトの名無しさん:03/07/04 15:24
wmfの画像について質問させてください。
wmfの事についてlibwmfのドキュメントを少し読んでみたのですが、
libwmf自体は各画像フォーマットへのインターフェース的な事だと
私は解釈したのですが、そういう事であっているのでしょうか?
そういう事であれば、wmfと言う画像フォーマットはヘッダ情報に
wmfと書かれた、実体はjpegであったり、その他色々な画像形式が
そのままで含まれている形式(?)と言う事なのでしょうか。

どなたか、わかる方がいたら教えてください。



82 :デフォルトの名無しさん:03/07/04 15:40
>>81
WMF=Windows Meta File

WindowsのGDI描画命令をそのまま保存されてるもの

83 :デフォルトの名無しさん:03/07/04 16:01
>>82
あ、なるほどそうですね。そういえばベクターフォーマットの形式ですね。
wmfって。

今、Javaでwmf画像のファイルを扱うプログラムを作りたいのですが、その
描画命令を理解できるParserが必要って事ですよね。こう言うのが載った
wmfフォーマット形式の仕様書みたいなのってどこかにあるんでしょうか?

84 :デフォルトの名無しさん:03/07/05 01:29
マイクロソフトのWin32のマニュアルに
APIを通じた入出力については書かれている

85 :32:03/07/09 01:37
>>80
大学でちょっと試す程度なので,なんとかお安くならないものでしょうか.
#シェアウェアでソースがあったら買ってしまいそうです.


86 :デフォルトの名無しさん:03/07/09 08:38
 長崎市の幼児誘拐殺人事件で、長崎県警捜査本部は、遺体発見現場近くの防犯
カメラ映像に残った幼児連れの若い男について画像分析などで、市内の13歳
の中学生とほぼ特定した。

もとの画像がどれだけ曖昧だったか気になるところ。

87 ::03/07/09 09:28
>>85
アカデミックユースですね。
なら無償でどうぞ。

88 :デフォルトの名無しさん:03/07/10 22:39
>>79
(1) XCreate
Pixmap でピックスマップを作る.
(2) ウィンドウに描くのと同じ要領でそれに描画.
(3) Expose イベントを取得したときに XCopyArea で
表示したいウィンドウに描画

でいかがでしょうか?

89 :デフォルトの名無しさん:03/07/10 22:41
スマソ修正
(1) XCreatePixmap でピックスマップを作る.

なんで改行入ったんだ?

90 :山崎 渉:03/07/15 10:01

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

91 :デフォルトの名無しさん:03/07/16 16:13
JPGからBMPに変換して、その色情報を
二次元配列に格納する関数ってありますか?
言語はCです。
よろしくお願いします。

92 :32:03/07/16 16:15
>>87
遅くなりました.
使わせて頂けませんでしょうか?
(まだちゃんとしたものを作るところまで使うかどうか全くわかりませんが)


93 ::03/07/19 11:31
>>92
メル欄

94 :79:03/07/20 18:08
>>88
やっぱりそうするしかないんでしょうか。
学校の solaris では期待したとおりの動作をするんですが……。

95 :デフォルトの名無しさん:03/07/21 07:59
>>94
今私の膝で開いてる本によると,バッキングストア機能は
持っているサーバと持ってないサーバがあるらしいです.


96 :95:03/07/21 08:01
訂正します
×バッキングストア機能は
○バッキングストア機能を


どの X サーバでも確実に動作させたいなら,
バッキングストア機能を頼るのはよくなさそうですね.

97 :デフォルトの名無しさん:03/07/21 21:56
>>91

割と最近のWindowsでは、DIBにJpegイメージを格納してデバイスコンテキストに描画できるらしい。
それでうまくいけば、DIBSectionのメモリデバイスコンテキストにでも描けばRGBの配列が得られるはず。


98 :デフォルトの名無しさん:03/07/22 20:05
(´・ω・`)ノ こんにちは。

画像ファイル .PCT と .PNG を自力で展開したいので、

上記2つのフォーマットの詳細な構造を知りたいのれす。

ご存知の方、ヒントでもなんでも良いのでよろしくお願いします。




99 :_:03/07/22 20:09
http://homepage.mac.com/hiroyuki44/

100 :98:03/07/22 20:19
(´・ω・`)ノ 言い忘れました。

日本語の情報が欲しいのれす。

http://www.wotsit.org/ にある英語情報は読めないのれす。



101 :デフォルトの名無しさん:03/07/22 21:57
たいした英語じゃないんだし読め。
でなければ翻訳サイトでも使え。
そうでなくともぐぐれば png形式は簡単に引っかかる

102 :デフォルトの名無しさん:03/07/24 03:34
私有セルを確保したいのですが、次のコードの最後の行で XAllocColorCells
が 0 を返します。
どこが悪いのでしょうか。

Display *display;
Colormap colormap;
unsigned long pixel[4];

display = XOpenDisplay(NULL);
colormap = DefaultColormap(display, DefaultScreen(display));
XAllocColorCells(display, colormap, False, NULL, 0, pixel, 4);

103 :_:03/07/24 03:36
http://homepage.mac.com/hiroyuki44/

104 :102:03/07/24 04:49
えーっと、やりたいのはフェードインのように
色を変化させることです。

105 :デフォルトの名無しさん:03/07/24 09:20
>>98
ttp://tech.millto.net/~pngnews/kndh/PngSpec1.2/PNGcontents.html

106 :32:03/07/25 18:13
>>93
何回かメール差し上げたのですが...


107 :_:03/07/25 18:14
http://homepage.mac.com/hiroyuki44/jaz05.html

108 ::03/07/31 12:07
>>106
あれ?届いてないよ。
じゃー、もひとつ。


109 :山崎 渉:03/08/02 02:09
(^^)

110 :デフォルトの名無しさん:03/08/04 16:33
jpgファイルを読み込んだり書き込んだりするにはどうしたらいいでしょうか?
jpgの構造が載っているページ、英語でも(もちろん日本語のほうが嬉しいですが)いいので教えてください。
自分でも少し検索してみたのですが、jpgだと画像が引っかかってしまい上手く検索できませんでした。


111 :デフォルトの名無しさん:03/08/04 16:50
>>110
IJGのlibjpeg使うよろし

112 :デフォルトの名無しさん:03/08/04 17:02
>>110
公式な情報はwww.jpeg.orgに(英語)。
日本語のWebサイトでは、
http://siisise.net/jpeg.html
とかを便利に使ってたけど。

あと、書籍では
http://www.amazon.co.jp/exec/obidos/ASIN/4797306327/
が分かりやすいと思うが、入手困難かも。


113 :110:03/08/04 17:59
>111 >112
すいません。jpegなめてました。さすが本一冊でちゃうだけのことはありますね。
おとなしくlibjpeg使います。
どうもありがとうございました。

114 :デフォルトの名無しさん:03/08/08 00:40
RGBからHSIへ変換し、またRGBに戻すというプログラムで質問です。

/***** hsi_data[0][g][r] 色相、hsi_data[1][g][r] 彩度、hsi_data[2][g][r] 明度 *****/
void rgb_to_hsi(double ***hsi_data, UCHAR ***rgb_data, int gyou, int retu){
int g,r;
double min_i,max_i;
double R,G,B;
for(g=0; g<gyou; g++)
for(r=0; r<retu; r++){
max_i = (MAX3(rgb_data[0][g][r],rgb_data[1][g][r],rgb_data[2][g][r]))/255.0;
min_i = (MIN3(rgb_data[0][g][r],rgb_data[1][g][r],rgb_data[2][g][r]))/255.0;

hsi_data[2][g][r] = (max_i+min_i)/2.0;
if(max_i - min_i <= EPSILON)
hsi_data[1][g][r] = 0.0;}
else{
if(hsi_data[2][g][r] <= 0.5) hsi_data[1][g][r] = (max_i-min_i)/(max_i+min_i);
else hsi_data[1][g][r] = (max_i-min_i)/(2-max_i-min_i);
R=(max_i-(rgb_data[0][g][r]/255.0))/(max_i-min_i);
G=(max_i-(rgb_data[1][g][r]/255.0))/(max_i-min_i);
B=(max_i-(rgb_data[2][g][r]/255.0))/(max_i-min_i);
if((rgb_data[0][g][r]/255.0 - max_i) <= EPSILON){
hsi_data[0][g][r] = (B-G)*PAI/3;
}else if((rgb_data[1][g][r]/255.0 - max_i) <= EPSILON){
hsi_data[0][g][r] = (2+R-G)*PAI/3;
}else if((rgb_data[2][g][r]/255.0 - max_i) <= EPSILON){
hsi_data[0][g][r] = (4+G-R)*PAI/3;
}
if(hsi_data[0][g][r] < 0)
hsi_data[0][g][r] += 2.0*PAI;
}}}

115 :続き:03/08/08 00:44
void hsi_to_rgb(UCHAR ***rgb_data, double ***hsi_data, int gyou, int retu){
int g,r,h;
UCHAR p,q,t;
for(g=0; g<gyou; g++)
for(r=0; r<retu; r++){
if(hsi_data[1][g][r] <= EPSILON) rgb_data[0][g][r] = rgb_data[1][g][r] = rgb_data[2][g][r] = (UCHAR)(hsi_data[2][g][r]*255+0.5);
else{
if(hsi_data[0][g][r] < 0.0) hsi_data[0][g][r] += 2*PAI;
h = (int)(hsi_data[0][g][r]/PAI*3);
if(hsi_data[0][g][r] >= 2*PAI) h=0;
p = (UCHAR)(hsi_data[2][g][r]*(1-hsi_data[1][g][r])*255+0.5);
q = (UCHAR)(hsi_data[2][g][r]*(1-hsi_data[1][g][r]*(hsi_data[0][g][r]-h))*255+0.5);
t = (UCHAR)(hsi_data[2][g][r]*(1-hsi_data[1][g][r]*(1-hsi_data[0][g][r]+h))*255+0.5);
switch(h){
case 0:
rgb_data[0][g][r]=(UCHAR)(hsi_data[2][g][r]*255), rgb_data[1][g][r]=t,rgb_data[2][g][r]=p;break;
case 1:
rgb_data[0][g][r]=q, rgb_data[1][g][r]=(UCHAR)(hsi_data[2][g][r]*255),rgb_data[2][g][r]=p;break;
case 2:
rgb_data[0][g][r]=p, rgb_data[1][g][r]=(UCHAR)(hsi_data[2][g][r]*255),rgb_data[2][g][r]=t;break;
case 3:
rgb_data[0][g][r]=p, rgb_data[1][g][r]=q,rgb_data[2][g][r]=(UCHAR)(hsi_data[2][g][r]*255);break;
case 4:
rgb_data[0][g][r]=t, rgb_data[1][g][r]=p,rgb_data[2][g][r]=(UCHAR)(hsi_data[2][g][r]*255);break;
case 5:
rgb_data[0][g][r]=(UCHAR)(hsi_data[2][g][r]*255), rgb_data[1][g][r]=p,rgb_data[2][g][r]=q;break;
default:
error1("hsi_to_rgb error");
}
}}}

116 :デフォルトの名無しさん:03/08/08 00:55
画像処理ってどうしてもこう
わけわかんない感じの
ながいコードになっちゃうんだよなあ
そこがツライ・・・

117 :115続き:03/08/08 01:02
んでこの関数を使うとこんな風になってしまいます。
http://www.42ch.net/UploaderSmall/source/1060271379.png
http://www.42ch.net/UploaderSmall/source/1060272009.ppm (間違ってppm上げてしまいました)
青が赤に・・・

検索もしてみましたが、彩度を求めるときに明度<=0.5 or 明度>0.5という判定を使っている式が見つかりませんでした。
この式は私が使っている教科書に載っているのですが、これにはHSI逆変換については載っていませんでした。
その為HSIからRGBにするときには使っていて、RGBからHSIに戻すときにこの判定が無く青が赤になってしまうのではないかと・・・。
結論を言いますと彩度を求めるときに明度の判定を用いているHSI逆変換プログラムの式を教えてください。

あとrgb_data[0][g]には赤、rgb_data[1][g]には緑、rgb_data[2][g]には青が入ってます。


118 :114:03/08/08 01:04
>116
改行制限とかタブが消えるとかあったのでマスマス分かりにくく・・・

119 :デフォルトの名無しさん:03/08/08 01:12
念の為加工画像のpngも上げてみました。
http://www.42ch.net/UploaderSmall/source/1060272692.png

参考にしたページ
http://216.239.57.104/search?q=cache:LAb_Oee8lKkJ:village.infoweb.ne.jp/~ishidate/vcpp6_g3/vcpp6_g3.htm+HSI%E5%A4%89%E6%8F%9B%E3%80%80HSI%E9%80%86%E5%A4%89%E6%8F%9B&hl=ja&lr=lang_ja&ie=UTF-8
http://216.239.57.104/search?q=cache:bO0-4KTmwMgJ:homepage1.nifty.com/susho/diary/2001/02.html+HSV%E9%80%86%E5%A4%89%E6%8F%9B&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja


120 :デフォルトの名無しさん:03/08/08 02:27
RGB⇔YUV変換なら分かるのだが


121 :デフォルトの名無しさん:03/08/08 10:39
>>114
RGB->HSI変換式が参考Webページと異なる気がするのだが。
HSVとHSI(HSL)がごっちゃになってる?
(どちらがどういう色空間だったかは忘れたけど)

122 :デフォルトの名無しさん:03/08/08 18:05
HSIというのは色相、彩度、明度でいいのかな
で明度は(Max+Min)/2の奴か。面倒だな
しかしよくごちゃごちゃ書いたもんだ。もう少し綺麗に書こうとは
思わないのかね。

123 :デフォルトの名無しさん:03/08/08 19:25
ごちゃごちゃ以前に,このソースコンパイラ通らないような気がする.

括弧の対応とか,case文の中身とか


124 :114:03/08/08 19:55
>121
rgb_data内にはunsigned char型として0〜255の値を格納しています。
その為HSI変換内で255で割って正規化しています。
あとは明度を求めるときにRGBの最大値と最小値の和を2で割って求めている点と、
彩度を求めている点でしょうか。

HSIとHSVとHSLは同じと下のページに書いてありました。
そこによるとIとIntensity、VはValue、LはLightness
http://216.239.57.104/search?q=cache:QRiStM-N1JUJ:www2u.biglobe.ne.jp/~color/all/ml_summary1501_1550.htm+HSI+HSV+HSL+value+intensity&hl=ja&lr=lang_ja&ie=UTF-8

と思ったのですがHSIとHSVは違うようで・・・
http://216.239.57.104/search?q=cache:BIysCB_YqegJ:homepage1.nifty.com/snap/room03/c02/cg/cg01_03.html+HSI+HSV+HSL+value+intensity&hl=ja&lr=lang_ja&ie=UTF-8

ここら辺が色の色相が変わる原因でしょうか?

>122>123
とりあえずソース上げてみました。
上のやつは見やすくするために全角スペース使ってる箇所があるのでそのままではコンパイラは通らないと思います。
あとUCHARはunsigned charです。
http://www.42ch.net/UploaderSmall/source/1060339287.c

125 :デフォルトの名無しさん:03/08/08 20:25
この関数は変換した値をそのまま画像データに入れていますが,
とりあえず,色の変換だけするように機能を削ってみてはいかがですか?
(rgb_to_hsiなら,入力が1画素分のRGB値,出力が1画素分のHSI値となるように)

このままだと,テスト実行するだけのためにいちいち三次元配列を
宣言しないといけないのでちょっと面倒です.


あと,この関数の実行例なども一緒にいれてほしいです.




126 :デフォルトの名無しさん:03/08/08 20:31
B=(max_i-(rgb_data[2][g][r]/255.0))/(max_i-min_i);
if((rgb_data[0][g][r]/255.0 - max_i) <= EPSILON){
hsi_data[0][g][r] = (B-G)*PAI/3;
}else if((rgb_data[1][g][r]/255.0 - max_i) <= EPSILON){
hsi_data[0][g][r] = (2+R-G)*PAI/3;
}else if((rgb_data[2][g][r]/255.0 - max_i) <= EPSILON){
hsi_data[0][g][r] = (4+G-R)*PAI/3;


の,(2+R-G)*PAI/3 のところは, (2+R-B)*PAI/3の間違いじゃない?


127 :126:03/08/08 21:24
126 と同じところで

if((rgb_data[*][g][r] / 255.0 - max_i) <= EPSILON)となっているところは,
if(fabs(rgb_data[*][g][r] / 255.0 - max_i)) <= EPSILON) にしないとまずいと思う.

ここは,rgb_data[*][g][r] /255.0 と max_i が同じかどうかを判定させる目的でやっている
と思うけど, 括弧の中が負になった場合も条件を満たしてしまう.

128 :126:03/08/08 21:38
114のいう
HSI -> RGB の変換方法を解いてみました.

(0 <= I <= 1,0 <= S <= 1,0 <= H < 2π)



I <= 0.5 のとき
  max = I(S + 1)
I > 0.5 のとき
  max = (1 - I)S + I
}

min = 2I - max

i = H / (3π) の整数部
hh = H / (3π) の小数部



129 :デフォルトの名無しさん:03/08/08 21:38
i = 0のとき
  R = max
  G = max * hh
  B = min
i = 1のとき
  R = max * (1 - hh)
  G = max
  B = min
i = 2のとき
  R = min
  G = max
  B = max * hh
i = 3のとき
  R = min
  G = max * (1 - hh)
  B = max
i = 4のとき
  R = max * hh
  G = min
  B = max
i = 5のとき
  R = max
  G = min
  B = max * (1 - hh)


130 :126:03/08/08 21:42
修正

>> i = H / (3π) の整数部
>> hh = H / (3π) の小数部

正しくは
i = H / (π / 3) の整数部
hh = H / (π / 3) の小数部


これでうまくいくはずです.

131 :デフォルトの名無しさん:03/08/08 22:06
一部間違えてました ごめんなさい

129 の中身全てをこれとすげ替えてください.

d = max - min

i = 0のとき
  R = max
  G = hh * d + min
  B = min
i = 1のとき
  R = (1 - hh) * d + min
  G = max
  B = min
i = 2のとき
  R = min
  G = max
  B = hh * d + min

i = 3のとき
  R = min
  G = (1 - hh) * d + min
  B = max
i = 4のとき
  R = hh * d + min
  G = min
  B = max
i = 5のとき
  R = max
  G = min
  B = (1 - hh) * d + min


132 :デフォルトの名無しさん:03/08/08 23:11
HSIの彩度はYHSの彩度とはずいぶんと違うものなんだな
それから別に聞かなくていいけど一言言いたい事は
色空間の変換は画素ごとに独立しているんだから
全画素にわたる反復と色空間の変換は別の関数にしたい、という事と
画素は一つの構造体(struct rgb{double r;double g;double b};)にまとめた
方が気分がいい、という事だな

133 :132:03/08/08 23:23
と思って調べたらHSIのは普通の彩度だな
>>114のはHSVで調べると出てくるような

134 :114:03/08/09 00:10
>125
そうですね。テストをするなら1画素に注目したほうがわかりやすいですもんね。
自分電卓使って手で求めてました・・・。
実行例は上の方にpng画像がまだあるハズです。

>126
おっしゃる通りです。
初歩的なミスを犯してました。
>127
そこの部分に関してはrgb_data[*][g][r]に格納させる値が0〜255なので問題はないかと思われます。
ですがプログラマとしてはそういった部分を気をつけるのは大切なことだと思ったので参考になりました。
>128-131
わざわざありがとうございます。早速コーディングしてみたのですが前と変わらなく・・・_| ̄|○
前というのは正確に言いますと
http://216.239.57.104/search?q=cache:LAb_Oee8lKkJ:village.infoweb.ne.jp/~ishidate/vcpp6_g3/vcpp6_g3.htm+HSI%E5%A4%89%E6%8F%9B%E3%80%80HSI%E9%80%86%E5%A4%89%E6%8F%9B&hl=ja&lr=lang_ja&ie=UTF-8
のソースをそのまま使った場合の結果です。
念の為ソースを上げておきます。コーディングミスの可能性が多分にありますので・・・
http://www.42ch.net/UploaderSmall/source/1060353992.c

>132-133
反復と変換を分けると関数の呼び出しが増えてたとえポインタで引数を渡したとしても
処理が遅くなったりしないんでしょうか?そこら辺詳しくないのでわからないのですが。
画素は確かに構造体にまとめたほうがいいですね。
あとこれは画像処理標準テキストブックを参考にしたのですが、そこにはHSI変換と書いてあり、
HSI双六角錐カラーモデルとありました。

135 :126:03/08/09 00:41
>>134

>> >127
>> そこの部分に関してはrgb_data[*][g][r]に格納させる値が0〜255なので問題はないかと思われます。

例えば, RGB 値が (0, 255, 0) のときを考えると,

max_i = 1.0,   rgb_data[0][g][r] = 0.0  のため,

if((rgb_data[0][g][r]/255.0 - max_i) <= EPSILON){
  hsi_data[0][g][r] = (B-G)*PAI/3;
}else if((rgb_data[1][g][r]/255.0 - max_i) <= EPSILON){
  hsi_data[0][g][r] = (2+R-B)*PAI/3;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ↑ここを実行したいにもかかわらず,
}else if((rgb_data[2][g][r]/255.0 - max_i) <= EPSILON){
  hsi_data[0][g][r] = (4+G-R)*PAI/3;
}

実際は
if((rgb_data[0][g][r]/255.0 - max_i) <= EPSILON){
  hsi_data[0][g][r] = (B-G)*PAI/3;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ↑ここを実行してしまう
}else if((rgb_data[1][g][r]/255.0 - max_i) <= EPSILON){
  hsi_data[0][g][r] = (2+R-B)*PAI/3;
}else if((rgb_data[2][g][r]/255.0 - max_i) <= EPSILON){
  hsi_data[0][g][r] = (4+G-R)*PAI/3;
}



136 :126:03/08/09 00:47
追加
rgb_to_hsi 内にやたらと / 255.0 が入っていますけど,
これをなくすように変更するだけでだいぶ単純になりますよ.

そうすれば, if( *** - max_i <= EPSILON) とやっているところも
自然と if ( *** == max_i) に置き換えられますから

137 :デフォルトの名無しさん:03/08/09 00:55
>>134
>反復と変換を分けると関数の呼び出しが増えてたとえポインタで引数を渡したとしても
>処理が遅くなったりしないんでしょうか?

高速化は、まともに動作するものが出来てから考えればよいかと。
最初は冗長でも可読性の良いコードを書くべし。


このスレ急に盛り上がってきたな。


138 :114:03/08/09 13:31
>135
そうですね・・・私が馬鹿でした。
ちょっと考えればわかることでした。
青が赤になってしまうのはここが原因だったようです。
>136
言われたとおり正規化したRGB値を格納する配列を作ってみました。
最初からこうしていればハマらなかったですね。

>137
盛り上がってきたようでその実私ばかり書き込んでるわけで。

126氏のプログラムとWEBのサンプルコードを比較してみました。
http://www.42ch.net/UploaderSmall/source/1060402857.png

やはり明度判定のある方が再現性が高いようです。
レスくれたみなさん。特に126氏。どうもありがとうございました。
分からないことがあったらまた来ると思いますのでそのときはよろしくお願いします。

139 :デフォルトの名無しさん:03/08/10 03:53
>>やはり明度判定のある方が再現性が高いようです。
RGB->HSI 変換、HSI->RGB変換は可逆変換なので、
完全に元に戻せるはずです。なので、
再現性うんぬんでなくて、正しいか間違っているかどちらかということになります。

114さんのHSIは双六角錐型、
WEBで紹介しているHSIは(単)六角錐型で異なる色空間(こちらはHSVと呼ばれることが
多いみたいです)なので、114さんがやったことは、結局下のようなことになります。

・RGB -> HSI 変換
・HSI を HSVとして読む
・HSV -> RGB変換

HSI と HSV はそれぞれ異なる色空間なので、最初のRGB値と最後のRGB値は
変わっていて当然なわけです。


いきなり画像を使って比較するのではなく、RGB値やHSI値を直接いれて
比較してみることをお勧めします。


140 :114:03/08/10 13:56
>>やはり明度判定のある方が再現性が高いようです。
>RGB->HSI 変換、HSI->RGB変換は可逆変換なので、
>完全に元に戻せるはずです。
ここに関してはとあるWEBページでHSV変換は

>もともと256階調のものをかたや0〜2π、かたや0〜1に変換するんだから、誤差くらい出る。
>それに、Hが同じでもVやIが低いとかなり色は不安定になる。
>そもそも、HSVへの変換は線形式使ってるわけじゃないんだから、完全な逆変換なんて存在しない。
これを読んでたために再現性という言葉を用いたわけですが、HSI変換は違うのでしょうか?
私も計算中の型落ち等で可逆変換は無理だと思います。

結論を言いますと明度判定のある逆変換がHSI逆変換(126氏の)で
無い方(WEBの)がHSV逆変換ということで、HSI変換で生成されたものに
HSI逆変換を施したのだからHSV逆変換を施したものより似ているのは当たり前である。
ということでよろしいでしょうか?

141 :デフォルトの名無しさん:03/08/10 14:30
>> HSI逆変換を施したのだからHSV逆変換を施したものより似ているのは当たり前である。
そうです。

(114氏の)HSI と,(WEBの)HSV では、 H の変換の仕方は同じですが、
SI と SV の変換の仕方がそれぞれ違います。
そのため、あべこべに使うと適切でない変換をしてしまうことになります。

>> >そもそも、HSVへの変換は線形式使ってるわけじゃないんだから、完全な逆変換なんて存在しない。
>> これを読んでたために再現性という言葉を用いたわけですが、HSI変換は違うのでしょうか?
>> 私も計算中の型落ち等で可逆変換は無理だと思います。

とりあえず、理論上は可逆にできると思います。
そして、少なくともこのケースでは充分な精度を持てば完全に可逆にできます。
証拠のソースも示しておきますね。

ソースの説明
(1) ある rgb 値を用意
(2) rgb -> hsi に変換
(3) hsi -> rgb に変換
(4) (3) で求めた rgb 値と (1) の rgb 値の差を求める.

全ての rgb 値についてこの処理をして、 (4)の和を求めます。
その和が 0 であれば誤差 0 といえます。

rgb それぞれ 8ビット(=256種類)ずつ、つまり、 256^3 色分だけ求めますので
かなり処理時間がかかると思います。なるべく速いマシンでやって下さい。



142 :デフォルトの名無しさん:03/08/10 14:32
#include <math.h>
#include <stdio.h>

#define PI 3.14159265358979
#define PI2 (PI * 2.0)
#define PI_3 (PI / 3.0)

//HSI双六角錐カラーモデル
static int max3(int x, int y, int z) {
 int i, a[3], max;
 a[0] = x;
 a[1] = y;
 a[2] = z;
 max = a[0];
 for (i = 1; i < 3; i++){
  if (max < a[i]) max = a[i];
 }
 return max;
}

static int min3(int x, int y, int z) {
 int i, a[3], min;
 a[0] = x;
 a[1] = y;
 a[2] = z;
 min = a[0];
 for (i = 1; i < 3; i++){
  if (min > a[i]) min = a[i];
 }
 return min;
}


143 :デフォルトの名無しさん:03/08/10 14:32
void rgb_to_hsi(double *hsi, unsigned char *rgb){
 double min, max, d;
 double r, g, b;

 r = rgb[0]; g = rgb[1]; b = rgb[2];

 max = max3(r, g, b);
 min = min3(r, g, b);
 d = max - min;

 hsi[2] = (max + min) / 510.0;
 if (max == 0.0){
  hsi[0] = 0.0; hsi[1] = 0.0;
 }else{
  if(hsi[2] <= 0.5){
   hsi[1] = d / (max + min);
  }else{
   hsi[1] = d / (510 - max - min);
  }
  if(rgb[0] == max){
   hsi[0] = (g - b) / d * PI_3 ;
  }else if(rgb[1] == max){
   hsi[0] = (2.0 + (b - r) / d) * PI_3;
  }else if(rgb[2] == max){
   hsi[0] = (4.0 + (r - g) / d) * PI_3;
  }
  if (hsi[0] < 0) hsi[0] += PI2;
 }
}



144 :デフォルトの名無しさん:03/08/10 14:37
void hsi_to_rgb(unsigned char *rgb, double *hsi){
 double H, S, I, hh;
 double max, min, d;
 int i;
 H = hsi[0];S = hsi[1];I = hsi[2];
 hh = H / PI_3; i = (int)hh; hh -= i;
 // H = i + hh (i : 整数部, hh : 小数部) (0 <= H < 6)

 if (I < 0.5) max = I * (S + 1.0);
 else max = (1.0 - I) * S + I;
 min = 2.0 * I - max; max *= 255.0; min *= 255.0; d = max - min;
 max += 0.5;min += 0.5; //四捨五入
 switch(i){
  case 0:
   rgb[0] = max;   rgb[1] = hh * d + min;   rgb[2] = min;  break;
  case 1:
   rgb[0] = (1 - hh) * d + min;   rgb[1] = max;   rgb[2] = min;  break;
  case 2:
   rgb[0] = min;rgb[1] = max;
 rgb[2] = hh * d + min;  break;
  case 3:
   rgb[0] = min;rgb[1] = (1 - hh) * d + min;
rgb[2] = max;  break;
  case 4:
   rgb[0] = hh * d + min;rgb[1] = min;rgb[2] = max;  break;
  case 5:
   rgb[0] = max;rgb[1] = min;
rgb[2] = (1 - hh) * d + min;  break;
 }
}


145 :デフォルトの名無しさん:03/08/10 14:38
int main(){
 unsigned char rgb[3];
 int i, j, k;
 double sum, sum_prev;
 double hsi[3];
 sum = 0.0;
 for (k = 0; k < 256; k++){
  for (j = 0; j < 256; j++){
   for (i = 0; i < 256; i++){
    sum_prev = sum;
    rgb[0] = i; rgb[1] = j; rgb[2] = k;
    rgb_to_hsi(hsi, rgb);
    hsi_to_rgb(rgb, hsi);
    sum += abs(rgb[0] - i) + abs(rgb[1] - j) + abs(rgb[2] - k);
    if (sum > sum_prev){ //誤差がでたときに表示されます
     printf("(%d, %d, %d) -> (%d, %d, %d)\n", i, j, k, rgb[0], rgb[1], rgb[2]);
    }
   }
  }
 }
 printf("sum : %f\n", sum);
 return 0;
}



//全角スペースをタブか半角スペースなどに変換してからコンパイルしてください.

146 :デフォルトの名無しさん:03/08/10 15:18
補足

rgb それぞれ8ビットずつのとき、どれくらいの精度があれば完全に可逆にできるか
検証してみました。
最も彩度の高い色がでる領域(HSI なら S=1.0, I=0.5 HSV なら S=1.0 V = 1.0)で、
赤(255, 0, 0)からその隣の色(マゼンタ(255, 0, 255)か黄色(255, 255, 0)) に移動するときに、 H に必要な精度を考えます。
(この移動で SI や SV は変わりません)
赤と黄色の中間色は 赤と黄色を含めて 256 通りあります。
なので、その間で H が 256 分割できるだけの精度(つまり 8 ビット)が必要になります。
白と黒を除くと原色は 6 個あるので、 H は全体で 256 * 6 分割 必要になります。
よって、2^10 < 256 * 6 < 2^11 なので、 H は 11 ビット必要となります。
今度はS=0からS=1.0に移動する場合を考えます。
Sの変化に対して最もよく色が変化する点はHSI なら I = 0.5、HSV なら V = 1.0です。
(S=0のとき、HSIは灰色(127,127,127)、HSVは白(255, 255, 255))
そこから、例えば赤(255, 0, 0)に移動することを考えます。
すると、HSIでは 128 分割、 HSV では 256 分割必要なので、多くても Sは 8 ビットあれば
充分です。
Iについても白と黒で同様に考えれば、 8ビットあれば充分です。

計算誤差に対する遊びを1〜2ビット用意したとしても
H 13ビット S 10ビット I 10ビット V 10ビット あれば誤差0にできるということになります。
ちなみに 142-145 のソースでは 全て double型(64ビット)でやっているので、この条件を
余裕でクリアしてます。


147 :デフォルトの名無しさん:03/08/10 16:17
もうひとつ 連投スマソ

>> 完全な逆変換なんて存在しない。

これがいいたいことは、こういうことかもしれないです。

H = 120度
S = 0
V = 0
↓ RGB へ 変換
R = G = B = 0 ← ここで H (Sも?)の情報が消える
↓ HSV へ 変換
H : 不定
S : 不定?
V = 0

HSV -> RGB -> HSV とやると、元の HSV の値は必ずしも復元できるとは限らないので、
そういう意味では互いに完全に可逆の関係とはいえないかもしれないです。

ですが、逆は可逆になると思います。
R = G = B = 0
↓ HSV へ 変換
H : 不定
S : 不定?
V = 0
↓ RGB へ 変換
R = G = B = 0 ← H, S がどんな値でも V=0 なら黒
HSI も I=0 のときに黒になることに加えて I=1 のときもH, S の値に関係なく白になるだけで
あとはだいたい同じかと思います。

148 :デフォルトの名無しさん:03/08/10 16:51
俺も書いてしまってもったいないから消す前に張っておく。

hsi_to_rgb 及び rgb_to_hsi
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=135&fi=no


149 :デフォルトの名無しさん:03/08/10 17:13
>>148
見事に整頓されてますね。

rgb_to_hsi と hsi_to_rgb の 引数 row, column は関数呼び出し側で&をつけるだけで
不要になるような気がしますがいかがでしょうか?


150 :148:03/08/10 19:08
>関数呼び出し側で&をつけるだけで
えーとポインタを渡すということ?

それからやはり浮動小数の0比較には誤差切捨てが必要
double chop(double d){ return fabs(d)<epsilon ? 0 : d ;}
としてif(chop(d)==0)...;、
あと構造体の変換にはコンストラクタがほしいなあ

151 :デフォルトの名無しさん:03/08/10 19:20
久しぶりにもりあがってきました。

152 :149:03/08/10 19:47
>>えーとポインタを渡すということ?
えっと、こんな感じで

HSI hsi[HEIGHT][WIDTH];
RGB rgb[HEIGHT][WIDTH];

.

for (j = 0; j < height; j++){
 for (i = 0; i < width; i++){
  rgb_to_hsi(&hsi[j][i], &rgb[j][i]);
 }
}



153 :114:03/08/11 23:05
>139
遅くなり申し訳ありません。
コンパイルして実行してみました。
そうしたらグレースケール時?にGreenの値が消えていたので
ソースをよく見たところ彩度が0の時の判定が抜けてました。
if (S == 0.0) {rgb[0] = rgb[1] = rgb[2] = I * 255.0; return;}
その他は問題がありませんでした。
仰るとおり可逆変換ですね。
ここまで細かく検証していただきありがとうございます。

>148
どうもありがとうございます。
RGB2RGB_INT内での丸め誤差と彩度の判定が無い以外問題はありませんでした。

他の人のソースコードはとても参考になります。
お二人ともどうもありがとうございました。

154 :山崎 渉:03/08/15 15:52
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

155 :デフォルトの名無しさん:03/08/17 19:42
クロマキーでは駄目なのか

156 :デフォルトの名無しさん:03/08/17 20:06
白黒画像なんだから、クロマキーは使えないでしょ。

54 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)