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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

3175閲覧

画像を読み込み,中心座標から半径100画素以上離れた場合に白色にしたいです。

kfejnrwdncjd

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/12 07:53

初めての利用になります。
(画像の中心座標を求める -src_img.cols: 幅 -src_img.rows: 高さ )(距離が閾値以上の場合は白色, 閾値未満は入力画像の画素値を入力する)

↓自分で書いてみました

#include <stdio.h>
#include <iostream>
#include <opencv2/opencv.hpp>
//画像ファイル (小さめが良い)
#define FILE_NAME "../Debug/aaa.jpg"
#define WINDOW_NAME_INPUT "input"
#define WINDOW_NAME_OUTPUT "output"
int main(int argc, const char * argv[]) {
int x, y;
//画像の入力
cv::Mat src_img = cv::imread(FILE_NAME);
if (src_img.empty()) {//入力失敗の場合
return (-1);

}
//出力画像のメモリ確保
cv::Mat dst_img = cv::Mat(src_img.size(), CV_8UC3);
for (y=0; y<src_img.rows; y++) {
//縦方向
for (x=0; x<src_img.cols; x++) {
//横方向//画素値の取得
cv::Vec3b s = src_img.atcv::Vec3b(y, x);
if (三平方でやることはわかるんですが…。式が分かりません。) {
s[0] = 255; //B
s[1] = 255; //G
s[2] = 255; //R
}else{
s[0] = s[0]; //B
s[1] = s[1]; //G
s[2] = s[2]; //R

}
dst_img.atcv::Vec3b(y, x) = s;
}
}
cv::imshow(WINDOW_NAME_INPUT, src_img);//画像の表示
cv::imshow(WINDOW_NAME_OUTPUT, dst_img);//画像の表示
cv::waitKey(); //キー入力待ち (止める)
return 0;
}

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

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

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

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

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

y_waiwai

2020/05/12 07:56

提示のコードではどういう動作になるんでしょうか。 また、コードは、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答3

0

数学的なことをすっとばして、処理結果だけを求めるならば

// 結果画像を白で塗りつぶした状態で作成 cv::Mat dst = cv::Mat(src.size(), CV_8UC3,cv::Scalar(255,255,255)); // 真ん中に黒い円を塗りつぶしで描く(例:半径100の円) cv::circle(dst, cv::Point(src.cols / 2, src.rows / 2), 100, cv::Scalar(0, 0, 0), -1, LINE_8, 0); // Orで合成 dst = src | dst;

投稿2020/05/13 07:11

yominet

総合スコア187

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

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

fana

2020/05/13 07:25 編集

どうでもいい程度の細かい事柄ですが, > 半径100画素以上離れた場合に白色 なので,黒円半径は100じゃダメかも. (じゃあ,99にすれば良いか?って言われるとそれも違う気がするし)
guest

0

各y座標毎に

三平方

で,下図のdxを求めることができる.
dxがわかれば,白く塗るべきx座標範囲がわかる.

イメージ説明

投稿2020/05/12 09:06

fana

総合スコア11708

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

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

fana

2020/05/12 09:07

もちろん,距離dyが半径rよりでかくなるy座標に関しては,dxを計算するまでもなく全部白塗りすればよい.
guest

0

C++

1中心のx = src_img.cols / 2; 2中心のy = src_img.rows / 2; 3for (y=0; y<src_img.rows; y++) { 4 for (x=0; x<src_img.cols; x++) { 5 if ( (x,y) と 中心との距離 > 100 ) { 6 dst_img.at<cv::Vec3b>(y, x) を白くする 7 } else { 8 dst_img.at<cv::Vec3b>(y, x) に src_img.at<cv::Vec3b>(y, x) をコピーする 9 } 10 } 11}

※ (x,y) と 中心との距離 : √((x-中心のx)の二乗 + (y-中心のy)の二乗)

投稿2020/05/12 08:01

編集2020/05/12 08:16
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問