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で質問しましょう!
似たような質問が見つかりました
- リフォーム・リノベーション 片流れの鼻隠しをガルバリウムで巻いてほしいのですが、換気棟との取り合いの部分について 3 2023/06/24 20:33
- ガーデニング・家庭菜園 ドラセナが枯れそうなのですが.. 5 2023/06/27 06:50
- 歯の病気 銀歯が取れて、ついでに、歯石取、レントゲン3枚不要 4 2023/04/28 15:16
- 家具・インテリア シャワーホースの修理 3 2022/08/15 12:40
- デスクトップパソコン 仕事で使うPC 10 2023/04/23 00:27
- 照明・ライト LEDテープライトの使い方について質問です。 階段を画像のようにしたいのですが、テープライトを使った 4 2022/10/14 08:24
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- 冷蔵庫・炊飯器 キッチンの横に置く場合の冷蔵庫の開き方 11 2022/04/06 13:30
- Illustrator(イラストレーター) イラストレーター(イラレ)で書き出した画像が荒れます… 3 2022/05/19 17:30
- その他(パソコン・周辺機器) iPhone→ PC取り込んだHDR動画が白くなってる 1 2023/07/24 22:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンをセル内一杯に表示させ...
-
水面の波紋
-
リンクを知らせる手のマークが...
-
画像をクリックして同じページ...
-
画像の横に文字をうまく配置で...
-
inputタグでサーバにデータを送...
-
UDP通信を使うチャットプログラ...
-
XML画像データををHTMLで簡単に...
-
画像のサイズが変わらない
-
ホームページの一番下に配置し...
-
画像を、横並びにするには!?
-
画像の場合のみ、下線を消す方...
-
Dreamweaverで画像サイズ修正
-
imgタグは何で囲むのが良いか
-
【HTML/CSS】ボタンの枠が伸び...
-
画像の縦サイズが小さいと隙間...
-
ポップアップウィンドウのサイ...
-
htmlの文字が縦書きになる
-
widthやheightの数値に単位(px...
-
リストマーカーをボックス内に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ボタンをセル内一杯に表示させ...
-
リンクを知らせる手のマークが...
-
htmlで画像を2個ずつ並べていき...
-
ポップアップウィンドウのサイ...
-
画像のサイズが変わらない
-
XML画像データををHTMLで簡単に...
-
【HTML/CSS】ボタンの枠が伸び...
-
UDP通信を使うチャットプログラ...
-
リンクを選択したときの青い枠...
-
favicon.ico はもういらない?
-
table で画像をピッタリとくっ...
-
CSSの左横に隙間ができてしまい...
-
HTMLのIMAGEに。。
-
ホームページで画像を横に並べ...
-
画像とテーブルの隙間をなくす。
-
リンクをつけた画像をクリック...
-
HTMLは、シングルクォートかダ...
-
縦長広告をウェブページの右側...
-
c言語を用いて画像の透明度をあ...
-
ホームページタグ打ち。サイズ...
おすすめ情報