『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

YUV形式の画像からY成分(輝度)だけを取りだすツールありましたら
教えてください。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

YUV(厳密にはYCbCr)形式の画像ファイルと呼ばれるものには


デフォルトの(事実上標準の)ファイル形式(フォーマット)というものがありません。

RGB形式ならBMPファイルなどが事実上の標準ですが。

#恐らく今までエンドユーザが扱う事などほぼ無かったがために
#事実上の標準とやらが生まれてこなかったものと推測されます。

従って、世の中のYUV形式のファイルと呼ばれるものの多くは独自フォーマットとなっています。
(格納順番、格納方向、色サンプリング、ヘッダの有無などが決まっていない)

すなわち質問者様がこれから扱おうとするYUVファイル(のフォーマット)を
知らせて頂かないと、どうしようもありません。

余談ですが、YUVを扱うツール類も大抵はそのフォーマット専用のものとなるようです。
私が知っているYUV操作ツールは、ベタ且つプレーナで
色サンプリングと画サイズはユーザ側で指定して
ヘッダなしのファイルを扱うものでした。

ただフォーマットが不明でもベタフォーマットであれば、
YUVには大抵パターンがありますので
データを詳しく調べればわかるかもしれません。
    • good
    • 0

ええと、



このカメラからのデータを処理したいのでしょうか。
それはYUV形式云々と別の話で、電子工作というかマイコンというかその辺の扱いを覚えてくださいということになります。

そうでないなら、繰り返しになりますが、画像の形式を特定してください。
YUVは色の形式であって画像ファイルの形式ではありません。
BMPかJPEGと言いますが、まずBMPでYUV形式というものは見たことがありません。
Yを取り出してほしいならまずはYUVのBMPを持ってきてくださいという話になります。
一方、JPEGはYUVですので可能性はあります。
ただ普通のソフトはRGBに直してから処理してしまいますので、YUVのまま扱えるソフトは残念ながら私は知りません。

ところでちょっと疑問に思うのですが、YUVにあまり詳しくないように見受けられますが、そもそもなぜYUVなのでしょうか。
RGBのファイルから輝度を計算で求めるのではいけませんか? いわゆるモノクロ化と呼ばれる処理で大抵の画像処理ソフトでできます。
    • good
    • 1

やはりよく分かりません。



> RAWの並びでそのようになっています。
RAW画像の話ですか?
それとも
> このような形式で作られたファイル(PEGとかBMP)
PEGとやらやBMPでの話でしょうか。

RAWについては詳しくないのでアドバイスはできません。
ただ、RAWとはすなわちカメラの撮像素子から得た"生"のデータの事です。YとUとVに分かれたデータが取れるような撮像素子は無いと思いますので(普通はRGBか緑黄マゼンタ)、YUVで記録されたものはRAWと言ってよいものでしょうか。

PEGという画像形式は聞いたことがないので検索してみましたが見つかりませんでした。

画像形式のBMPにおいてYUV形式というのは聞いたことがありません。何か特殊なソフトで作ったのでしょうか。
普通のRGBのBMPとして読み込めるようなものなら、RGBのRを取り出すような操作をすればYUVのYが取り出せるのではないでしょうか。
それとも一般的にビットマップという意味でしょうか。それならそのファイルの形式が分からなければどうにもなりません。

この回答への補足

ご丁寧にありがとうございます。
私もよくわかっていないので質問しております。
YUV形式とは、調べた限り以下HPの8/15
ページが参考になります。
http://www.robotsfx.com/robot/AG_CAM08.html

いずれにしてもカメラカラの画像でYUV形式
になっている画像(JPEGかBMP)から
Y成分(輝度)だけをとりだしたいのです。

補足日時:2011/02/05 22:11
    • good
    • 0

YUV形式の画像とは何でしょうか。


画像形式が分からないと何とも言えません。

この回答への補足

お返事ありがとうございます。
YUVとかRGBとか形式があります。
YUV形式とはY=輝度、UVが色となっているものです。
RAWの並びでそのようになっています。

このような形式で作られたファイル(PEGとかBMP)
のなかからY(輝度)だけを取り出したいのです。
そして最終的にはBMPにしたいのです。

よろしくおねがいします。

補足日時:2011/02/04 07:19
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QYUV⇔RGB変換がうまくいきません。

24bppRaw(R,G,Bの順番)を以下の式でYUVに変換します。
layer[i+j]がRでlayer[i+j+1]がGでlayer[i+j+2]がBです。

Y=(unsigned char)(0.257*layer[i+j]+0.504*layer[i+j+1]+0.098*layer[i+j+2]+16);
U=(unsigned char)(-0.148*layer[i+j]-0.291*layer[i+j+1]+0.439*layer[i+j+2]+128);
V=(unsigned char)(0.439*layer[i+j]-0.368*layer[i+j+1]-0.071*layer[i+j+2]+128);

そのあとにYUVをRGBのrawに以下の式で変換します。

Y=layer[i+j];
U=layer[i+j+1]-128;
V=layer[i+j+2]-128;
R=(unsigned char)(1.164*(Y-16)+1.596*V);
B=(unsigned char)(1.164*(Y-16)+2.018*U);
G=(unsigned char)(1.164*(Y-16)-0.391*U-0.813*V);


しかし元のRGBにはならず画像がおかしくなります。
もちろんオーバーフロー、アンダーフローなどは丸めています。
どのような式を用いれば、RGB⇔YUV 相互変換ができるのが
ご教授ください。もう半年くらい随分迷っています。
ダイレクトに式だけ提示いただけるだけで結構なので
よろしくおねがいいたしますm(___)m

参考HP
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
http://www.sm.rim.or.jp/~shishido/yuv.html

24bppRaw(R,G,Bの順番)を以下の式でYUVに変換します。
layer[i+j]がRでlayer[i+j+1]がGでlayer[i+j+2]がBです。

Y=(unsigned char)(0.257*layer[i+j]+0.504*layer[i+j+1]+0.098*layer[i+j+2]+16);
U=(unsigned char)(-0.148*layer[i+j]-0.291*layer[i+j+1]+0.439*layer[i+j+2]+128);
V=(unsigned char)(0.439*layer[i+j]-0.368*layer[i+j+1]-0.071*layer[i+j+2]+128);

そのあとにYUVをRGBのrawに以下の式で変換します。

Y=layer[i+j];
U=layer[i+j+1]-128;
V=layer[i+j+2]-128;
R=(unsigned char)...続きを読む

Aベストアンサー

式はソースからそのまま抜き出してきたものでしょうか?
もしそうなら、まずオーバーフローの処理がまずいです。

計算結果がunsigned charの範囲外になる場合があって、unsigned charの範囲内に丸めるためには、
計算結果を取りうる範囲の変数(例えばint)に入れて、丸めの処理をしたあと、
unsigned charに代入する必要があります。

RGB→YUVの時、U,Vはunsigned charだったりしませんか?
unsigned charのU,Vに-128を引いた値を入れてしまうと、
layer[i+j+1]、layer[i+j+2]が128以下のときオーバーフローが発生してしまいます。
ですので、U,Vをint等にするか、
Yと同じように式中で- 128してあげる必要があります。
(これは型を指定してない整数リテラルがint型なのと、
暗黙の型変換によってintに昇格されて計算されるため、
オーバーフローが発生しなくなっています)

サンプルコードです。
layerはunsigned charと仮定します。
丸め範囲はYUV,RGBともに0~255にしています。

RGB→YUV
Yo, Uo, Voが出力です。

int Ys, Us, Vs;
unsigned char Yo, Uo, Vo;

Ys = 0.257 * layer[i+j] + 0.504 * layer[i+j+1] + 0.098 * layer[i+j+2] + 16;
Us = -0.148 * layer[i+j] - 0.291 * layer[i+j+1] + 0.439 * layer[i+j+2] + 128;
Vs = 0.439 * layer[i+j] - 0.368 * layer[i+j+1] - 0.071 * layer[i+j+2] + 128;

if( Ys < 0 ){
Yo = 0;
}else if( Ys > 255 ){
Yo = 255;
}else{
Yo = Ys;
}

if( Us < 0 ){
Uo = 0;
}else if( Us > 255 ){
Uo = 255;
}else{
Uo = Us;
}

if( Vs < 0 ){
Vo = 0;
}else if( Vs > 255 ){
Vo = 255;
}else{
Vo = Vs;
}



YUV→RGB
Ro, Go, Boが出力です。

int Y, U, V;
int Rs, Gs, Bs;
unsigned char Ro, Go, Bo;

Y = layer[i+j] - 16;
U = layer[i+j+1] - 128;
V = layer[i+j+2] - 128;

Rs = 1.164 * Y + 1.596 * V;
Bs = 1.164 * Y + 2.018 * U;
Gs = 1.164 * Y - 0.391 * U - 0.813 * V;

if( Rs < 0 ){
Ro = 0;
}else if( Rs > 255 ){
Ro = 255;
}else{
Ro = Rs;
}

if( Gs < 0 ){
Go = 0;
}else if( Gs > 255 ){
Go = 255;
}else{
Go = Gs;
}

if( Bs < 0 ){
Bo = 0;
}else if( Bs > 255 ){
Bo = 255;
}else{
Bo = Bs;
}

式はソースからそのまま抜き出してきたものでしょうか?
もしそうなら、まずオーバーフローの処理がまずいです。

計算結果がunsigned charの範囲外になる場合があって、unsigned charの範囲内に丸めるためには、
計算結果を取りうる範囲の変数(例えばint)に入れて、丸めの処理をしたあと、
unsigned charに代入する必要があります。

RGB→YUVの時、U,Vはunsigned charだったりしませんか?
unsigned charのU,Vに-128を引いた値を入れてしまうと、
layer[i+j+1]、layer[i+j+2]が128以下のときオーバーフローが発生...続きを読む

QRGB→YUV変換のプログラム

RGB→YUV変換を行っているのですが、
うまくいきません。

以下であっているのでしょうか?
//RGB > YUV変換
void RGBtoYUV(char *filename,int width,int height)
{
FILE *fpt,*fpt_output;
unsigned char *Input,*head;
unsigned char Y=0,U=0,V=0;
int i,j,b_flag=1;
int modification=0;
modification=width%4;

//ファイルのオープン
fopen_s(&fpt,filename,"rb");
if(fpt==NULL)
{

char DebugStr[256];
wsprintf(DebugStr,"%sが存在しません",filename);
MessageBox(NULL,DebugStr,"File Error",MB_OK);
}
else
{
fopen_s(&fpt_output,"YUV.bmp","wb");

//ヘッダ情報の書き込み
head=(unsigned char*)malloc(54);
fread(head,sizeof(unsigned char),54,fpt);
fwrite(head,sizeof(unsigned char),54,fpt_output);
free(head);
Input=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
//メモリに展開
for(i=0;i<height;i++)
{
fread(&Input[i*(3*width)],sizeof(unsigned char),3*width,fpt);
fseek(fpt,modification,SEEK_CUR);
}
fclose(fpt);//Inputファイルのクローズ

for(i=0;i<3*width*height;i+=3*width)
{
for(j=0;j<3*width;j+=3)
{
Y=(unsigned char)(0.299*Input[i+j+2]+0.587*Input[i+j+1]+0.114*Input[i+j]);
U=(unsigned char)(-0.169*Input[i+j+2]-0.3316*Input[i+j+1]+0.500*Input[i+j]);
V=(unsigned char)(0.500*Input[i+j+2]-0.4186*Input[i+j+1]-0.0813*Input[i+j]);

//Y
if(Y<0)
{
Input[i+j]=0x00;

}
else if(Y>255)
{
Input[i+j]=0xff;
}
else
{
Input[i+j]=Y;
}

//U
if(U<0)
{
Input[i+j+1]=0x00;
}
else if(U>255)
{
Input[i+j+1]=0xff;

}
else
{

Input[i+j+1]=U;
}
//V
if(V<0)
{
Input[i+j+2]=0x00;
}
else if(V>255)
{
Input[i+j+2]=0xff;
}
else
{
Input[i+j+2]=V;
}
}

}//i

fseek(fpt_output,54,SEEK_SET);
for(i=0;i<height;i++)
{
fwrite(&Input[3*width*i],sizeof(unsigned char),3*width,fpt_output);

//修正値の代入
for(j=0;j<modification;j++)
{
fwrite("\x000",sizeof(unsigned char),1,fpt_output);
}
}
fclose(fpt_output);

free(Input);



}

}


又 YUV→RGBにすると元の画像に戻らずに困っています。
プログラムに対するご指摘お願いします。

このプログラムはWindowGUIで幅と高さとファイル名を入力して
走らせるプログラムです。24bpp BMPが対象です。

RGB→YUV変換を行っているのですが、
うまくいきません。

以下であっているのでしょうか?
//RGB > YUV変換
void RGBtoYUV(char *filename,int width,int height)
{
FILE *fpt,*fpt_output;
unsigned char *Input,*head;
unsigned char Y=0,U=0,V=0;
int i,j,b_flag=1;
int modification=0;
modification=width%4;

//ファイルのオープン
fopen_s(&fpt,filename,"rb");
if(fpt==NULL)
{

char DebugStr[256];
wsprintf(DebugStr,"%sが存在しません",filename);
MessageBox(NULL,DebugStr,"F...続きを読む

Aベストアンサー

Y,U,Vの計算の仕方がまずいです。
unsigned charですと0~255の範囲の値しか取りませんので、
Y,U,Vが0~255の範囲外の場合オーバーフローが発生し正しい数値ではなくなるので、
shortやintなどの範囲の大きい変数に入れて計算し、丸め処理等を行う必要があります。

あとその計算式の場合Yの範囲は0~255ですが、U,Vの範囲は-128~127です。
今の処理だと、U,Vが0~255の範囲に丸められてしまいます。
あと、U,Vはsigned charの範囲(-128~127)なので、signed charとして処理してやるとかしないと、おかしくなると思います。

QテレビでYUVはなぜ採用されたのでしょう

質問はタイトルの通りです。
仕事の関係でYUVに接する機会があったのですが、
そもそもアナログでも最初からRGBを採用すれば良かったのではないかと思いました。

それに対する結論はRGBだと情報量が多くなるので、
情報量がより少ないYUVが採用されたと一応結論づけていました。

ところが実際にYUVをみてみるとYC分離だのやっていることが結構複雑で、
とてもRGBとYUVの情報量の差だけの問題ではないような気がしてきました。

すると次に考えたのは電気的特性からYUVが採用されたのではないかということです。
しかし、ここまで来ると私では全くのお手上げになってしまいました。
ご存じの方、よろしくお願いいたします。

Aベストアンサー

 専門分野なので少し詳しく説明致します。

 日本のテレビ放送はNTSC方式で白黒のテレビから放送が始められ、1CH当りの周波数帯域割り当ては6MHZです、この中に映像信号と音声信号を包括する必要が有り、映像搬送波は下から1.25MHZの位置に有り更に其の上4.5MZに音声搬送波が有る為、映像信号帯域幅は4.2MHZとなっています。(4.5+1.25=5.75音声帯域として6-5.75=0.25MHZとなり4.5-0.25=4.25だが干渉を防ぐ為映像帯域を4.2MHZとしている)
 水平解像度は4200÷16(水平走査線周波数15.75+帰線時間分0.25)=262.5になりますが此れを出発点を変えて奇数と偶数に分けて2回送る事により、525本の解像度を得ていますが、合計1秒間に30枚の画面を送る事になります。(インターレース方式と言う)

 此処に更にカラーの信号を載せて白黒と互換性を図るのですが、映像信号で鮮鋭度が必要なのは輝度信号で此れをY信号と言い、映像搬送波から3.58MHZ上にカラー信号用の副搬送波を設けて、(この信号は水平同期信号の後ろにバースト信号として送りこの信号で3.58MHZの水晶発信機の同期を取る)この搬送波にI、Q信号と言う直交2相変調によるカラー信号を送ります。(映像信号と同居するのでインターリーブと言う)
 この信号を復調してマゼンタとシアンの色信号を取り出しますが、此れは赤と青つまりYUVでは有りません、更にイエローが欠落しています、これを輝度信号と足し算して赤、青、緑の信号を作るのです。
 此処でなぜRGBでは無くYMCを使うのかと言うと加算回路が簡単になるからです。
 尚、色信号は細かい情報を送る必要が無く最高1.5MHZの帯域で現在のアナログカラーテレビの色を再現しています。

 専門分野なので少し詳しく説明致します。

 日本のテレビ放送はNTSC方式で白黒のテレビから放送が始められ、1CH当りの周波数帯域割り当ては6MHZです、この中に映像信号と音声信号を包括する必要が有り、映像搬送波は下から1.25MHZの位置に有り更に其の上4.5MZに音声搬送波が有る為、映像信号帯域幅は4.2MHZとなっています。(4.5+1.25=5.75音声帯域として6-5.75=0.25MHZとなり4.5-0.25=4.25だが干渉を防ぐ為映像帯域を4.2MHZとしている)
 水平解像度は4200÷16(水平走査線周波数15.75+帰線時間分0.25)...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q"PAL"と"NTSC"って何ですか。

"PAL"と"NTSC"って何ですか。
これってビデオかなんかの規格ですか。
結構いそいでます。教えて下さい。

Aベストアンサー

テレビの規格で、解像度や電波送信の方法などが違ってきます。
日本ではNTSCですが、ヨーロッパ、中国はPALになっているそうです。
何らかの変換をしないと両者の画像は交換できないみたいです。

コンピューターで見れば大抵PALかNTSCかの選択が出来るようなので問題ないかもしれません。

参考URL:http://www1g.mesh.ne.jp/aloha/tushin/oubun/a69.htm

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

QガウシアンフィルタのCプログラム

画像を平滑化する手法にガウシアンフィルタというものがあります。
現在、このガウシアンフィルタをCで作成しようとしていますが、いまいち分かりません。

自分なりに調べてみたところ、平滑化の移動平均フィルタやメディアンフィルタに関しては様々な書籍やサイトがあるのですが、ガウシアンフィルタに関してはあまり見つかりませんでした。

行いたい処理は、簡単に次の通りです。
画像ファイルの読み込み

フィルタ処理

処理後の画像をファイル出力

ガウシアンフィルタに関して詳しく書いてある書籍やサイトがあればお教え願います。できれば、ソースプログラムも書いてあると助かります。

当方、参考書籍として、「C言語で学ぶ実践画像処理-井上他」という本を使用しています。

Aベストアンサー

ググってみたところ
http://teo.sourceforge.jp/doc/TeoProgrammingGuide/section5-2.html
ここが最も分かりやすかったです。

f(x,y)=exp(-(x^2+y^2)/(2*sigma^2))
で、x,yはそれぞれ整数座標で計算すればよいようです。
上webページの説明だと、x,yそれぞれ-1~1の3x3座標、つまり注目座標の9近傍で打ち切っています。
その9個のf(x,y)の加算値をaとすると、ゲインが1となるようにf(x,y)/aを用います。(これを正規化と呼びます)

Qエクセル STDEVとSTDEVPの違い

エクセルの統計関数で標準偏差を求める時、STDEVとSTDEVPがあります。両者の違いが良くわかりません。
宜しかったら、恐縮ですが、以下の具体例で、『噛み砕いて』教えて下さい。
(例)
セルA1~A13に1~13の数字を入力、平均値=7、STDEVでは3.89444、STDEVPでは3.741657となります。
また、平均値7と各数字の差を取り、それを2乗し、総和を取る(182)、これをデータの個数13で割る(14)、この平方根を取ると3.741657となります。
では、STDEVとSTDEVPの違いは何なのでしょうか?統計のことは疎く、お手数ですが、サルにもわかるようご教授頂きたく、お願い致します。

Aベストアンサー

データが母集団そのものからとったか、標本データかで違います。また母集団そのものだったとしても(例えばクラス全員というような)、その背景にさらならる母集団(例えば学年全体)を想定して比較するような時もありますので、その場合は標本となります。
で標本データの時はSTDEVを使って、母集団の時はSTDEVPをつかうことになります。
公式の違いは分母がn-1(STDEV)かn(STDEVP)かの違いしかありません。まぁ感覚的に理解するなら、分母がn-1になるということはそれだけ結果が大きくなるわけで、つまりそれだけのりしろを多くもって推測に当たるというようなことになります。
AとBの違いがあるかないかという推測をする時、通常は標本同士の検証になるわけですので、偏差を余裕をもってわざとちょっと大きめに見るということで、それだけ確証の度合いを上げるというわけです。


人気Q&Aランキング