No.1ベストアンサー
- 回答日時:
画像処理のことはよくわかりませんが、こんなかんじでどうでしょう?
[ step 1 ]
まず、「円」を中心と半径で定義します。中心座標を cx, cy 、半径を r とすると、任意の点 x, y が次式を満たす場合、その点は円の内部の点であると言えます。
((cx - x) * (cx - x) + (cy - y) * (cy - y)) < (r * r) ・・・式(1)
[ step 2 ]
しかし、そのままでは画素数を数えられないので、中心座標と半径から画素数を数える範囲を正方形で切り出します。具体的にはx座標は cx - r から cx + r まで、y座標も同様に cy - r から cy + r までの正方形の中で、すべての座標について上記の式(1)を満たす座標の数を数えれば画素数が求まります。
[ step 3 ]
しかし、このままでは計算量が多くなってしまうので、step 2 を円の1/4で考えて、計算結果を4倍すればもっと計算量を減らせます。さらに、円の1/8で考えても同じことなので、切り出す正方形を直角三角形にして計算結果を8倍すればもっともっと計算量を減らせます。
あとはこれをソースコードに落とせば良いでしょう。
また、もっと効率的な方法がないものかと思い、全然別なアプローチも考えてみました。考え方は次の通り。
まず、1辺の長さが 2r の正方形を考えます。この正方形の面積は 4 * r * r です。続いて半径 r の円の面積は PI * r * rですから、面積比は
(円の面積)/(正方形の面積)= (PI*r*r) / (4*r*r) = PI / 4
であることがわかります。この結果を使って半径 r の円内にある画素数を考えると、
(円の画素数)= PI / 4 * (正方形の画素数) ・・・式(2)
で求まりますね。
すごくシンプルになりました。
そういうことじゃなくて?
この回答への補足
ありがとうございます。すごい参考になりました。
step1,step2を簡単にプログラムを書くと
※__は空白の意味
for(j=0;j<ysize;j++){______//xsizeは画像の縦、ysizeは横の長さ
__for(i=0;i<xsize;i++){____//画像の画素値全てを確認
___if(中心座標){
____if(((cx - x) * (cx - x) + (cy - y) * (cy - y)) < (r * r)){
______//中心座標を中心とした正方形の範囲内の画素値を読み込み
____}
___}
__}
}
という感じになりました。
また、もう一つの計算方法についてもプログラムを書いてみたいと思います。
ただ、[step3]についてですが、読み込んだ部分の画素値で読み込まなかった部分の画素値を補うということでしょうか?
No.2
- 回答日時:
Windowsでの最も簡単な方法。
1.画像と同一サイズのBITMAPを用意する。BITMAPは256階調のグレースケールにする
2.GDI関数のFillRectを用いてBITMAPの全面を画素値0で塗り潰す
http://msdn.microsoft.com/ja-jp/library/cc428605 …
3.GDI関数のEllipticを用いてBITMAPに画素値255で塗り潰した円を描く
http://msdn.microsoft.com/ja-jp/library/cc428585 …
4.作製したBITMAPの画素をスキャンする。スキャンの範囲は円の左上と右下を対角とする矩形の範囲で良い。BITMAPの矩形内に画素値255の画素があったら、同じ座標にある画像データの画素を拾う
この方法の利点は、2の部分を色々と改造すると★型多角形など、複雑な形状の領域を検出できる、と言う事。
また、BITMAPで描画する際の画素値が0~255の256段階なので、画素値に重みを設け、元画像と演算する事も可能。
例えば、BITMAPに領域を描画する際にスムージング処理を施せば
BITMAPの画素値が0⇒元画像のデータの0%を拾う
BITMAPの画素値が64⇒元画像のデータの25%を拾う
BITMAPの画素値が128⇒元画像のデータの50%を拾う
BITMAPの画素値が192⇒元画像のデータの75%を拾う
BITMAPの画素値が255⇒元画像のデータの100%を拾う
という処理をして「輪郭をスムージングした領域のデータを拾う」と言う事も可能。
この方法は「画像のマスクを作成する」と言う、画像処理の基本テクニック。
普通は「領域の方程式を用いて、方程式で範囲の判定をする」と言う汎用性の無い方法は使用しない。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 画像の画素値を変えるC言語のプログラムで指定された画像の中に白い三角形を右上に表示させるにはどのよう 3 2022/10/30 01:16
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- 数学 画像の問題72の(1)について質問します。 解答によると、aを0≦a≦2の範囲で動かすとwの範囲がも 1 2023/08/14 17:06
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Excel(エクセル) 単価シートから単価をエクセル関数で自動取得する方法 1 2023/07/02 22:00
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- その他(プログラミング・Web制作) ロボットの作り方を教えて下さい! なにも知らない素人です。 全て自作する場合、どうすればよいでしょう 6 2022/12/18 01:25
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 1 2022/06/18 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
エクセルである点からの距離で...
-
y=x^2の座標をプロットするプロ...
-
3次元空間上の2つの座標から...
-
エクセルで回転する座標の出し方
-
始点、終点の二つの座標と半径...
-
動きベクトル(オプティカルフ...
-
緩やかなカーブを表現する
-
以下のプログラムは重心を求め...
-
VBで、開いているExcelシートの...
-
Fortranで直交座標から極座標変...
-
重力の計算
-
シーケンサー(PLC?)で制...
-
OpenCvSharp4による画像判定解...
-
3次元空間における平行回転移動...
-
任意の座標が、閉図形の内側か...
-
DirectXを使ってテクスチャ(画...
-
オブジェクト指向による座標変...
-
多角形の内部かどうか判定する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
エクセルで回転する座標の出し方
-
エクセルである点からの距離で...
-
3次元空間上の2つの座標から...
-
閉図形の座標の配列が右回りか...
-
ダイアログ内コントロールの位...
-
始点、終点の二つの座標と半径...
-
座標を持った平面範囲に座標を...
-
空間上の二点を結ぶ直線上に任...
-
エクセルシート上のマウスポイ...
-
多角形の内部かどうか判定する方法
-
ワード上Shapeの位置情報を統一...
-
Excel VBA で自在に図形を変化...
-
OpenCvSharp4による画像判定解...
-
C言語 配列で座標
-
以下のプログラムは重心を求め...
-
シーケンサー(PLC?)で制...
-
交差する2線分の交点座標の求め方
-
VB6のPrinter.ScaleWidth に対...
おすすめ情報