有没有办法将高斯布鲁尔或中值平滑滤波器应用于浮点数,同时提供应忽略的像素掩码?
你能帮帮我吗? TY。答案 0 :(得分:3)
您可以通过以下方式执行此操作:
步骤3中的除法补偿了由掩蔽引入的黑色像素。这是因为平滑的蒙版以与平滑蒙版图像相同的方式变暗。
答案 1 :(得分:-1)
这是代码......我觉得很难理解:(
int main()
{
int height=5;
int sigma=2;
if(height%2==1)
{
Mat image= (Mat_<float>(7,7) <<
2,2,2,2,2,2,2,
2,2,2,2,2,2,2,
2,2,2,2,2,2,2,
2,2,2,2,2,2,2,
2,2,2,2,2,2,2,
2,2,2,2,2,2,2,
2,2,2,2,2,2,2 );
Mat theMask= (Mat_<float>(7,7) <<
1,0,1,1,1,1,0,
1,0,1,1,1,1,1,
1,0,1,1,0,1,1,
1,1,0,0,0,1,1,
1,0,1,0,0,1,1,
1,0,1,1,1,0,1,
1,0,1,1,1,1,1);
Mat output= Mat(7,7,CV_32F);
Mat kernely;
Mat tempkernel;
int halfy=int(height/2);
double coeffToSum=0;
int numOfZeros=0;
float sum=0;
for(int j=0;j<image.cols;j++)
{
for(int i=0;i<image.rows;i++)
{
kernely=getGaussianKernel(height,sigma);
tempkernel=getGaussianKernel(height,sigma);
if(theMask.at<float>(i,j)==0)
{
output.at<float>(i,j)=theMask.at<float>(i,j);
}
else
{
for(int x=-halfy;x<=halfy;x++)
{
if(theMask.at<float>(borderInterpolate(i+x,theMask.rows,BORDER_REPLICATE),j)==0)
{
numOfZeros++;
tempkernel.at<double>(0,x+halfy)=0;
}
}
if( numOfZeros==height-1)
{
output.at<float>(i,j)=image.at<float>(i,j);
}
else
{
for(int x=-halfy;x<=halfy;x++)
{
if(theMask.at<float>(borderInterpolate(i+x,theMask.rows,BORDER_REPLICATE),j)==0)
{
coeffToSum=kernely.at<double>(0,x+halfy)/(height-numOfZeros);
kernely.at<double>(0,x+halfy)=0;
for(int w=0;w<height;w++)
{
if(tempkernel.at<double>(0,w)!=0)
kernely.at<double>(0,w)=kernely.at<double>(0,w)+coeffToSum;
}
}
}
for(int x=-halfy;x<=halfy;x++)
{
sum=sum+image.at<float>(borderInterpolate(i+x,image.rows,BORDER_REPLICATE),j)
* kernely.at<double>(0,x+halfy);
}
output.at<float>(i,j)=sum;
sum=0;
}
numOfZeros=0;
}
}
}
cout<<" "<<output<<endl;
}
else
{
}
return 1;
}