2016-05-25 5 views
0

小さな非長方形部分のみが有用な画像があります。私は有用なROIを示すバイナリマスクを持っています。非矩形ROI内のOpenCV filter2D

OpenCVのcv::filter2Dをバイナリマスクで定義されたROIにのみ適用するにはどうすればよいですか?


編集ROI外部

私の画素は、他の周り300〜500の浮動小数点値を有する0の値を有するので、ROIの境界におけるfilter2Dに伴う問題は、高い値の遷移を有します。それはまた、単にROI内の最も近いピクセルとしてROI外の画素値を設定するにしてもよいでしょう

cv::BORDER_REPLICATE

+0

は、私はあなたが使用することができると思うの国境マスクの近くには問題ないと思います[CV :: DILATE()](http://docs.opencv.org/3.1.0/d9/d61/tutorial_py_morphological_ops.html #gsc.tab = 0)あなたのコードを共有すると、回答が得られるかもしれません。 – sturkmen

答えて

0

に似た何かが、この等であってもよいです。私は

#include "opencv2/opencv.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 


int main(int argc, char* argv[]) 
{ 
Mat m = imread("f:/lib/opencv/samples/data/lena.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

Mat mask=Mat::zeros(m.size(), CV_8UC1),maskBlur,mc; 
// mask is a disk 
circle(mask, Point(200, 200), 100, Scalar(255),-1); 

Mat negMask; 
// neg mask 
bitwise_not(mask, negMask); 
circle(mask, Point(200, 200), 100, Scalar(255), -1); 
Mat md,mdBlur,mdint; 

m.copyTo(md); 

// All pixels outside mask set to 0 
md.setTo(0, negMask); 
imshow("mask image", md); 
// Convert image to int 
md.convertTo(mdint, CV_32S); 
Size fxy(13, 13); 
blur(mdint, mdBlur, fxy); 
mdBlur.convertTo(mc, CV_8U); 
imshow("Blur without mask", mc); 
imwrite("blurwithoutmask.jpg",mc); 
mask.convertTo(maskBlur, CV_32S); 
// blur mask 
blur(maskBlur, maskBlur, fxy); 
Mat mskB; 
mskB.setTo(1, negMask); 
divide(mdBlur,maskBlur/255,mdBlur); 

mdBlur.convertTo(mc, CV_8U); 
imshow("Blur with mask", mc); 
imwrite("blurwithmask.jpg",mc); 
waitKey(); 

} 
+0

ありがとうございました:)申し訳ありませんが、これが何をするのか、それがどのように役立つのか分かりません。 – manatttta

+0

私はあなたの質問を理解できなかったかもしれません。以前のプログラムでは、すべてのイメージにfilter2dを適用し(マスク外のすべてのピクセルを0に設定)、結果は0に設定されたピクセルを無視するように修正されました。この補正はウェイトを使用して行われます。あなたのorignalイメージの結果をコピーすることができたら – LBerger

関連する問題