###C++で畳み込みを実装したい
C++でopencvを用いて畳み込みを実装しています
filter2Dなどの関数がある事は知っていますが、自分で関数を作ります。
自分で実装したコードはエラーは出ませんが出力が元の画像とはかけ離れたものになってしまいます
###原画像、出力画像
###該当のソースコード
C++
1void convolution(Mat& src, Mat& mask){ 2 // src:原画像 mask:畳み込むフィルター 3 int srcW = src.rows; 4 int srcH = src.cols; 5 int maskW = mask.rows; 6 int maskH = mask.cols; 7 8 // フィルターの半径 9 int rx=(maskW-1)/2; 10 int ry=(maskH-1)/2; 11 12 // 出力画像を初期化 13 dst=Mat::zeros(srcW, srcH, CV_8U); 14 15 for(int x=0; x<srcW; x++){ 16 for(int y=0; y<srcH; y++){ 17 double sum=0; 18 19 for(int i=0; i<maskW; i++){ 20 int pointx = x-rx+i; 21 for(int j=0; j<maskH; j++){ 22 int pointy = y-ry+j; 23 // pointが原画像の中である(原画像の外を参照する場合は何もしない) 24 if((pointx>=0 && pointx<srcW) && (pointy>=0 && pointy<srcH)){ 25 // フィルターと原画像の積を総和する 26 sum+=kernel.at<unsigned char>(i,j)*src.at<unsigned char>(pointx,pointy); 27 } 28 } 29 } 30 // 結果を出力画像に入れる 31 dst.at<unsigned char>(x,y)=sum; 32 } 33 } 34/* 画素値を0−255にスケーリングする事を試みましたが、結果が変わりませんでした 35 float fmin=FLT_MAX; 36 float fmax=-(FLT_MAX); 37 for(int k=0; k<dst.rows; k++){ 38 for(int l=0; l<dst.cols; l++){ 39 float pixel=dst.at<unsigned char>(k,l); 40 if (pixel > fmax) 41 fmax=pixel; 42 if (pixel < fmin) 43 fmin=pixel; 44 } 45 } 46 47 for(int m=0; m<dst.rows; m++){ 48 for(int n=0; n<dst.cols; n++){ 49 dst.at<unsigned char>(m,n)=(dst.at<unsigned char>(m,n)-fmin)*255.0/(fmax-fmin); 50 } 51 } 52 */ 53}
###試したこと
原画像の外のピクセルを参照していることへの対処やスケーリングなどを加えてみましたが、出力画像はめちゃくちゃのままでした
###補足情報(言語/FW/ツール等のバージョンなど)
コンパイルにはMakefileを使用しています
ソースコードはこちら(問題のファイル名はkadaiC.cpp)
# Makefile template for building OpenCV programs in C # Usage: Change the TARGET to foo when compiling foo.c or foo.cpp # Target program TARGET=kadaiC # Compiler #CC=gcc CC=g++ # Compiler options CFLAGS=`pkg-config --cflags opencv` -O3 LDFLAGS=`pkg-config --libs opencv` OBJS= $(TARGET).o #OBJS= $(TARGET).o src1.o src2.o # Default target all: $(TARGET) # Linking objects $(TARGET): $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS) # Compile C source to objects .c.o: $(CC) $(CFLAGS) -c $< # Compile C++ source to objects .cpp.o: $(CC) $(CFLAGS) -c $< # Clean up for re-building clean: rm *.o
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/18 18:27