次のような割り当てがあります:「画像をスキャンし、+-45 度と +-60 度の線のみを保持するために、適切なカーネルで cvFilter2D 関数を使用する」。
特にカーネルの計算方法について、誰かが私にいくつかの手がかりを教えてもらえますか?
次のような割り当てがあります:「画像をスキャンし、+-45 度と +-60 度の線のみを保持するために、適切なカーネルで cvFilter2D 関数を使用する」。
特にカーネルの計算方法について、誰かが私にいくつかの手がかりを教えてもらえますか?
少し事前計算が必要です。ラインカーネルを作成したいと思います。そのため、ラインを作成する方法を知る必要があります。
http://courses.engr.illinois.edu/ece390/archive/archive-f2000/mp/mp4/anti.htmlには多くのテクニックが含まれています。
最後に、カーネル内のすべてのピクセルを合計し、合計が 1 になるように正規化します。
お返事が遅れて申し訳ありません !私はこの割り当てを行いました!まず、Perfanoffさん、ありがとうございました!あなたの参照リンクのおかげで、私は問題を解決する方法を見つけました!これが私のコードです:
// Image Transforms.cpp : Defines the entry point for the console application.
/*The purpose of this program is to detect lines which are +-45 degree and +- 60 degree from a binary picture.*/
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
//IplImage* src = cvLoadImage("C:\\Users\\USER\\Desktop\\black white 1.jpg");
IplImage* src = cvLoadImage("C:\\Users\\USER\\Desktop\\line detection 4.png");
cvNamedWindow("src", CV_WINDOW_NORMAL);
cvShowImage("src", src);
IplImage* DstSum = cvCreateImage(cvGetSize(src),src->depth, 3);
IplImage* Dst45 = cvCreateImage(cvGetSize(src),src->depth, 3);
IplImage* Dst135 = cvCreateImage(cvGetSize(src),src->depth, 3);
IplImage* Dst60 = cvCreateImage(cvGetSize(src),src->depth, 3);
IplImage* Dst120 = cvCreateImage(cvGetSize(src),src->depth, 3);
/*double Ker0 [] = { -0.1,-0.1,-0.1,-0.1,-0.1,
0, 0, 0, 0, 0, 0,
0.2,0.2,0.2,0.2,0.2,
0, 0, 0, 0, 0, 0,
-0.1,-0.1,-0.1,-0.1,-0.1
};
double Ker90 [] = {-0.1,0,0.2,0,-0.1,
-0.1,0,0.2,0,-0.1,
-0.1,0,0.2,0,-0.1,
-0.1,0,0.2,0,-0.1,
-0.1,0,0.2,0,-0.1
}; */
double Ker45[]={
0,-0.1,-0.1, 0, 0.2,
-0.1,-0.1, 0, 0.2, 0,
-0.1, 0, 0.2, 0,-0.1,
0, 0.2, 0,-0.1,-0.1,
0.2, 0,-0.1,-0.1, 0
};// 45 degree
CvMat Kernel45=cvMat(5, 5, CV_64FC1,Ker45);
double Ker135[]={
0.2, 0,-0.1,-0.1, 0,
0, 0.2, 0,-0.1,-0.1,
-0.1, 0, 0.2, 0,-0.1,
-0.1,-0.1, 0, 0.2, 0,
0,-0.1,-0.1, 0, 0.2
};// 135 degree
CvMat Kernel135=cvMat(5, 5, CV_64FC1,Ker135);
double Ker120[] = {0,0,0,0,0,0,0,
1/7,0.25/7,0,0,0,0,0,
0,0.75/7,0.75/7,0.25/7,0,0,0,
0,0,0,0.75/7,0.6/7,0.25/7,0,
0,0,0,0,0.4/7,0.75/7,1/7,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0
};//120 degree
CvMat Kernel120=cvMat(7, 7, CV_64FC1,Ker120);
double Ker60[] = {0,0,0,0,1/7,0,0,
0,0,0,0.25/7,0.75/7,0,0,
0,0,0,0.6/7,0.4/7,0,0,
0,0,0.25/7,0.75/7,0,0,0,
0,0,0.75/7,0.25/7,0,0,0,
0,0.25/7,0.75/7,0,0,0,0,
0,1/7,0,0,0,0,0
};//60 degree
CvMat Kernel60=cvMat(7, 7, CV_64FC1,Ker60);
cvFilter2D(src,Dst60,&Kernel60,cvPoint(-1,-1));
cvThreshold(Dst60,Dst60,100,255,CV_THRESH_BINARY);
cvFilter2D(src,Dst120,&Kernel120,cvPoint(-1,-1));
cvThreshold(Dst120,Dst120,100,255,CV_THRESH_BINARY);
cvFilter2D(src,Dst45,&Kernel45,cvPoint(-1,-1));
cvThreshold(Dst45,Dst45,200,255,CV_THRESH_BINARY);
cvFilter2D(src,Dst135,&Kernel135,cvPoint(-1,-1));
cvThreshold(Dst135,Dst135,200,255,CV_THRESH_BINARY);
cvAdd(Dst45,Dst60,DstSum,NULL);
cvAdd(Dst135,DstSum,DstSum,NULL);
cvAdd(Dst120,DstSum,DstSum,NULL);
cvNamedWindow("dst", CV_WINDOW_NORMAL);
cvShowImage("dst", DstSum);
cvReleaseImage(&DstSum);
cvWaitKey(0);
cvReleaseImage(&src);
cvDestroyWindow("src");
cvDestroyWindow("dst");
return 0;
}
結果は次のとおりです。