アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

画像の2値化(黒は全てゼロ、白は全て255)をした画像bw_imgを用意して
左上端から11×11サイズのROIに切り取って決まった処理をかけていこうとしていますが、
2値化した画像をROIで保持させることができず、困っています。
int main()
{//画像の2値化処理用変数
IplImage *src_img = 0, *dst_img = 0, *bw_img = 0;
IplImage *src_img_gray = 0;
IplImage *tmp_img, *out_img, *lap_img;
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *contours = 0;

// (1)画像を読み込み、グレースケール化(src_img_gray)、二値化(tmp_img)
src_img = cvLoadImage("C:\\Users...\\サンプル画像\\sample.jpg", CV_LOAD_IMAGE_COLOR);
tmp_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);
src_img_gray = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);//もとはIPL_DEPTH_8U
cvCvtColor(src_img, src_img_gray, CV_BGR2GRAY);
cvAdaptiveThreshold(src_img_gray, tmp_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 8);

//11×11 走査用変数
dst_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1);
bw_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1);
out_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1);
cvThreshold(tmp_img, bw_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

for (x = 0; x < bw_img->width; x++){ // x 座標を 1ピクセルずつ進める
for (y = 0; y < bw_img->height; y++){ // y 座標を 1ピクセルずつ進める
//(1) 11×11ピクセルに切り取って2値化する。
cvCopy(bw_img, dst_img);
lap_img = cvCreateImage(cvSize(11, 11), IPL_DEPTH_8U, 1);
CvMat *sub = cvCreateMatHeader(11, 11, CV_8UC1);
cvGetSubRect(bw_img, sub, cvRect(y, x, 11, 11));//コピー画像から11×11切り取り。
cvThreshold(sub, lap_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//2値化、結果はlap_img.

uchar iro = lap_img->imageData[lap_img->widthStep * (y + 6) + (x + 6)];

if (iro ==0){ →ここでどうみても黒なのにiroに「238」「71」などの値が入っています。

roiで切り取ったlap_imgが2値になっていません。
何が問題で2値化できていないのでしょうか。
どうすると2値化した画像(lap_img)を決まったサイズのウィンドウで扱えるでしょうか。
もしおわかりでしたらヒントでも結構ですのでぜひ教えてください。
よろしくお願いします。

A 回答 (1件)

11x11の画像を二値化しているのに、 なぜ元の画像と同じ大きさのlap_imgwo用意して、x+6,y+6 (ともに11以上になることがある)の値を見るのですか?




他に
・元画像を二値化したtmp_imgを、二値化してbw_imgにして、
それを毎回dst_imgにコピーしてから 11x11の部分を二値化する、
って、なんか、無駄なことしてませんか?
二値化した画像をさらに二値化するのって、なにか意図があるのですか?
毎回bw_imgからdst_imgにコピーするのって、なにか意図があるのですか?


> for (x = 0; x < bw_img->width; x++){ // x 座標を 1ピクセルずつ進める
> for (y = 0; y < bw_img->height; y++){ // y 座標を 1ピクセルずつ進める
だと、11x11の右下の座標(x+10,y+10)が画像からはみ出ることがあります。
そのことを意識してやってますか?
はみ出ないようにするには、範囲を調整する必要があります。
    • good
    • 0
この回答へのお礼

kmeeさま

いつも大変お世話になっております!
あけまして おめでとうございます。
今年もどうぞ よろしくお願い致します。

ご指摘のとおりで「なぜ何度も2値化をしたのだろう」から始まり
2値化についての勘違い(ゼロかイチに変わると思っていました)も調べて理解しました。
希望どおりの結果が得られました。
本当にありがとうございました。

お礼日時:2015/01/08 01:25

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