A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんばんは。
補足いただきました。(3)~(7)の間で、関数に渡すべきIPLを間違えている様です。
・ROIを指定されたimgに対する二値化で、閾値が低かったのではないでしょうか。画像の色彩によっては真っ暗に成ったり、真っ白に成ったりします。色々な画像で試すか、閾値を半分位にセットした方が良いかもしれません。
・ROIの領域外を白く塗り潰すのは、src_imgに対して行う事ではないでしょうか。
// (3)二値化:cvThreshold
//cvThreshold (src_img_gray, img, 70, 255, CV_THRESH_BINARY); 閾値が低すぎるのでは?
cvThreshold (src_img_gray, img, 128, 255, CV_THRESH_BINARY);
//---------------------------------------------------------
CvRect rec = cvRect(x, y, width, height);
//Thresholdのウィンドウに表示するイメージ
cvSetImageROI(img, rec);
//lenaのウィンドウに表示するイメージ
//cvFill(img, rec, CV_RGB(255, 255, 255)); 領域外を白く塗り潰すIPLはimgでは無く、src_imgの方では?
cvFill(src_img, rec, CV_RGB(255, 255, 255));//recの領域外を白で塗り潰す
//-------------------------------------------------------
// (7)画像を表示する
ご回答ありがとうございました。
無事に一部分だけを表示することができました。
またの機会がありましたらよろしくお願いいたします。
No.1
- 回答日時:
こんばんは。
>>取り出した部分以外を白にする仕方が分かりません。
流石に此れは正攻法では無理みたいです。
選択肢は、ROIで指定した領域の外部を矩形で白く塗り潰すか、ループしながら領域を避けてイメージデータに直描きをするか、に成りそうです。
矩形で塗り潰すやり方は、こんな感じです。参考程度に。
#define ARRAYCOUNT(a) (sizeof(a) / sizeof(a[0]))
#define ARRAYEND(a) ((a) + ARRAYCOUNT(a))
static void cvFill(IplImage* img, const CvRect& cvrc, CvScalar color)
{
const CvRect arc[] =
{
{0, 0, img->width, cvrc.y},//上隅
{0, cvrc.y + cvrc.height, img->width, img->height},//下隅
{0, cvrc.y, cvrc.x, cvrc.y + cvrc.height},//左隅
{cvrc.x + cvrc.width, cvrc.y, img->width, cvrc.y + cvrc.height}//右隅
};
for(const CvRect* it = arc; it != ARRAYEND(arc); ++it)
{
::cvRectangle(img, ::cvPoint(it->x, it->y), ::cvPoint(it->width, it->height), color, CV_FILLED);
}
}
//使用する
CvRect rec = cvRect(30,120,160,50);
cvSetImageROI(tmp_img1, rec);
cvFill(img, rec, CV_RGB(255, 255, 255));//recの領域外を白で塗り潰す
この回答への補足
早速のご回答ありがとうございます。
このことを参考にして作ってみました。
//---------------------------------------------------------------
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#define ARRAYCOUNT(a) (sizeof(a) / sizeof(a[0]))
#define ARRAYEND(a) ((a) + ARRAYCOUNT(a))
static void cvFill(IplImage* img, const CvRect& cvrc, CvScalar color)
{
const CvRect arc[] =
{
{0, 0, img->width, cvrc.y},//上隅
{0, cvrc.y + cvrc.height, img->width, img->height},//下隅
{0, cvrc.y, cvrc.x, cvrc.y + cvrc.height},//左隅
{cvrc.x + cvrc.width, cvrc.y, img->width, cvrc.y + cvrc.height}//右隅
};
for(const CvRect* it = arc; it != ARRAYEND(arc); ++it)
{
::cvRectangle(img, ::cvPoint(it->x, it->y), ::cvPoint(it->width, it->height), color, CV_FILLED);
}
}
int
main (int argc, char **argv)
{
int x = 30;
int y = 120;
int width = 160;
int height = 50;
IplImage *src_img = 0;
IplImage *src_img_gray = 0;
IplImage *tmp_img1= 0;
IplImage *img =0;
char imgfile[] = "chie.jpg";
src_img = cvLoadImage (imgfile, CV_LOAD_IMAGE_COLOR);
img = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);
src_img_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);
cvCvtColor (src_img, src_img_gray, CV_BGR2GRAY);
// (2)ガウシアンフィルタで平滑化を行う
cvSmooth (src_img_gray, src_img_gray, CV_GAUSSIAN, 5);
// (3)二値化:cvThreshold
cvThreshold (src_img_gray, img, 70, 255, CV_THRESH_BINARY);
//---------------------------------------------------------
CvRect rec = cvRect(x, y, width, height);
cvSetImageROI(img, rec);
cvFill(img, rec, CV_RGB(255, 255, 255));//recの領域外を白で塗り潰す
//-------------------------------------------------------
// (7)画像を表示する
cvNamedWindow ("Threshold", CV_WINDOW_AUTOSIZE);
cvShowImage ("Threshold", img);
cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE);
cvShowImage ("lena",src_img);
cvWaitKey (0);
//メモリを解放
cvReleaseImage (&src_img);
cvReleaseImage (&src_img_gray);
cvReleaseImage (&img);
//ウィンドウを破棄
cvDestroyWindow ("lena");
cvDestroyWindow ("Threshold");
return 0;
}
//---------------------------------------------------------------
実行してみるとROIで取り出したところが白くなった画像のみが表示されてしまいました。
よろしければ改善点を教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cssで、チェックボックスの画像...
-
ボタンをセル内一杯に表示させ...
-
table で画像をピッタリとくっ...
-
リンクを知らせる手のマークが...
-
FC2カートのテンプレートでの商...
-
HTMLタグのDL DT DDを使ってli...
-
UDP通信を使うチャットプログラ...
-
リンクを選択したときの青い枠...
-
htmlのolやulなどlistにtitleや...
-
htmlの文字が縦書きになる
-
含む含まないという概念自体の...
-
質問1.
-
idの中のid指定
-
widthやheightの数値に単位(px...
-
smallにtext-allignが効かない
-
<div id="container">の使いか...
-
「諸要素」とはどういう意味で...
-
divを横に並べる方法
-
W3Cのソースコードの検証サービ...
-
CSS、width100%でもできる余白
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ボタンをセル内一杯に表示させ...
-
リンクを知らせる手のマークが...
-
画像をクリックして元に戻すには
-
favicon.ico はもういらない?
-
htmlでキャラクター画像を、サ...
-
機種依存文字、m2(平方メート...
-
HTMLのIMAGEに。。
-
XML画像データををHTMLで簡単に...
-
ホームページで画像を横に並べ...
-
UDP通信を使うチャットプログラ...
-
ポップアップウィンドウのサイ...
-
【HTML/CSS】ボタンの枠が伸び...
-
inputタグでサーバにデータを送...
-
アップロードするとレイアウト...
-
画像の場合のみ、下線を消す方...
-
cssで、チェックボックスの画像...
-
imgタグは何で囲むのが良いか
-
かなり初心者の質問です。簡単...
-
画像を隙間なく配置する方法
-
CSSの左横に隙間ができてしまい...
おすすめ情報