Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV:具有高斯模糊的裁剪图像_C++_Opencv_Image Processing_Gaussian - Fatal编程技术网

C++ OpenCV:具有高斯模糊的裁剪图像

C++ OpenCV:具有高斯模糊的裁剪图像,c++,opencv,image-processing,gaussian,C++,Opencv,Image Processing,Gaussian,我有一个灰度图像,我想裁剪一个以像素(x,y)为中心的矩形。问题是,我不希望裁剪看起来是方形的,所以在边缘周围,我希望高斯模糊这些值,以便它们平滑地过渡到零。有什么办法吗 目前我正在做: int bb_min_x = center_x - width/2.0; int bb_max_x = center_x + width/2.0; int bb_min_y = center_y - height/2.0; int bb_max_y = center_y + height/2.0; for(

我有一个灰度图像,我想裁剪一个以像素
(x,y)
为中心的矩形。问题是,我不希望裁剪看起来是方形的,所以在边缘周围,我希望高斯模糊这些值,以便它们平滑地过渡到零。有什么办法吗

目前我正在做:

int bb_min_x = center_x - width/2.0;
int bb_max_x = center_x + width/2.0;

int bb_min_y = center_y - height/2.0;
int bb_max_y = center_y + height/2.0;

for(int y = bb_min_y; y <= bb_max_y; y++){
    for(int x = bb_min_x; x <= bb_max_x; x++){
        final_img.at<uchar>(y,x) = original_img.at<uchar>(y,x);
    }
}
intbb_min_x=中心x-宽度/2.0;
int bb_max_x=中心x+宽度/2.0;
int bb_min_y=中心y-高度/2.0;
int bb_max_y=中心y+高度/2.0;

对于(int y=bb_min_y;y,如果将边界框转换为轮廓,则可用于计算每个像素到边界框边缘的距离。如果根据此距离将颜色值降低到零,则会获得模糊效果


请参阅以获取示例。

如果将边界框转换为轮廓,则可用于计算每个像素到边界框边缘的距离。如果根据此距离将颜色值降低到零,则会获得模糊效果

请参阅以获取示例。

尝试此功能:

计算与输入矩形的距离,并将其用作衰减因子

cv::Mat cropFade(cv::Mat _img, cv::Rect _roi, int _maxFadeDistance)
{
cv::Mat fadeMask = cv::Mat::ones(_img.size(), CV_8UC1);
cv::rectangle(fadeMask, _roi, cv::Scalar(0),-1);

cv::imshow("mask",fadeMask>0);

cv::Mat dt;
cv::distanceTransform(fadeMask > 0, dt, CV_DIST_L2 ,CV_DIST_MASK_PRECISE);



// fade to a maximum distance:
double maxFadeDist;

if(_maxFadeDistance > 0)
    maxFadeDist = _maxFadeDistance;
else
{
    // find min/max vals
    double min,max;
    cv::minMaxLoc(dt,&min,&max);
    maxFadeDist = max;
}


//dt = 1.0-(dt* 1.0/max);   // values between 0 and 1 since min val should alwaysbe 0
dt = 1.0-(dt* 1.0/maxFadeDist); // values between 0 and 1 in fading region

cv::imshow("blending mask", dt);


cv::Mat imgF;
_img.convertTo(imgF,CV_32FC3);


std::vector<cv::Mat> channels;
cv::split(imgF,channels);
// multiply pixel value with the quality weights for image 1
for(unsigned int i=0; i<channels.size(); ++i)
    channels[i] = channels[i].mul(dt);

cv::Mat outF;
cv::merge(channels,outF);

cv::Mat out;
outF.convertTo(out,CV_8UC3);



return out;
}
cv::Mat cropFade(cv::Mat\u img,cv::Rect\u roi,int\u maxfadestance)
{
cv::Mat fadeMask=cv::Mat::ones(_img.size(),cv_8UC1);
cv::矩形(fadeMask,_roi,cv::标量(0),-1);
cv::imshow(“遮罩”,fadeMask>0);
cv::Mat dt;
距离变换(fadeMask>0,dt,cv距离L2,cv距离掩码精确);
//衰减到最大距离:
双MaxFadeList;
如果(_MaxFadeInstance>0)
maxFadeDist=\u maxFadeDistance;
其他的
{
//查找最小/最大VAL
双最小值,最大值;
cv::minMaxLoc(dt,&min,&max);
maxFadeDist=最大值;
}
//dt=1.0-(dt*1.0/max);//值介于0和1之间,因为最小值应始终为0
dt=1.0-(dt*1.0/maxFadeDist);//衰落区域中介于0和1之间的值
cv::imshow(“混合掩模”,dt);
cv::Mat-imgF;
_img.convertTo(imgF,CV_32FC3);
矢量信道;
cv::分割(imgF,通道);
//将像素值和图像1的质量权重相乘
对于(无符号整数i=0;i请尝试此函数:

计算与输入矩形的距离,并将其用作衰减因子

cv::Mat cropFade(cv::Mat _img, cv::Rect _roi, int _maxFadeDistance)
{
cv::Mat fadeMask = cv::Mat::ones(_img.size(), CV_8UC1);
cv::rectangle(fadeMask, _roi, cv::Scalar(0),-1);

cv::imshow("mask",fadeMask>0);

cv::Mat dt;
cv::distanceTransform(fadeMask > 0, dt, CV_DIST_L2 ,CV_DIST_MASK_PRECISE);



// fade to a maximum distance:
double maxFadeDist;

if(_maxFadeDistance > 0)
    maxFadeDist = _maxFadeDistance;
else
{
    // find min/max vals
    double min,max;
    cv::minMaxLoc(dt,&min,&max);
    maxFadeDist = max;
}


//dt = 1.0-(dt* 1.0/max);   // values between 0 and 1 since min val should alwaysbe 0
dt = 1.0-(dt* 1.0/maxFadeDist); // values between 0 and 1 in fading region

cv::imshow("blending mask", dt);


cv::Mat imgF;
_img.convertTo(imgF,CV_32FC3);


std::vector<cv::Mat> channels;
cv::split(imgF,channels);
// multiply pixel value with the quality weights for image 1
for(unsigned int i=0; i<channels.size(); ++i)
    channels[i] = channels[i].mul(dt);

cv::Mat outF;
cv::merge(channels,outF);

cv::Mat out;
outF.convertTo(out,CV_8UC3);



return out;
}
cv::Mat cropFade(cv::Mat\u img,cv::Rect\u roi,int\u maxfadestance)
{
cv::Mat fadeMask=cv::Mat::ones(_img.size(),cv_8UC1);
cv::矩形(fadeMask,_roi,cv::标量(0),-1);
cv::imshow(“遮罩”,fadeMask>0);
cv::Mat dt;
距离变换(fadeMask>0,dt,cv距离L2,cv距离掩码精确);
//衰减到最大距离:
双MaxFadeList;
如果(_MaxFadeInstance>0)
maxFadeDist=\u maxFadeDistance;
其他的
{
//查找最小/最大VAL
双最小值,最大值;
cv::minMaxLoc(dt,&min,&max);
maxFadeDist=最大值;
}
//dt=1.0-(dt*1.0/max);//值介于0和1之间,因为最小值应始终为0
dt=1.0-(dt*1.0/maxFadeDist);//衰落区域中介于0和1之间的值
cv::imshow(“混合掩模”,dt);
cv::Mat-imgF;
_img.convertTo(imgF,CV_32FC3);
矢量信道;
cv::分割(imgF,通道);
//将像素值和图像1的质量权重相乘
对于(无符号整数i=0;i一种简单方法:

// Create a weight image
int border=25;
cv::Mat_<float> rect=cv::Mat_<float>::zeros(height,width)
cv::rectangle(rect,cv::Rect(border/2,border/2,width-border,height-border),cv::Scalar(1),-1);
cv::Mat_<float> weights, kernel=cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(border,border));
int nnz = cv::countNonZero(kernel);
cv::filter2D(rect,weights,-1,kernel/nnz);
//创建权重图像
int-border=25;
cv::Mat_uuRect=cv::Mat_uRect::零(高度、宽度)
cv::矩形(矩形,cv::矩形(边框/2,边框/2,宽度边框,高度边框),cv::标量(1),-1);
cv::Mat_uu权重,kernel=cv::getStructuringElement(cv::变形椭圆,cv::大小(边框,边框));
int nnz=cv::countNonZero(内核);
cv::filter2D(rect,权重,-1,内核/nnz);
这将创建一个权重图像,如下所示:

然后使用它淡出图像:

for(int y = bb_min_y; y <= bb_max_y; y++){
    for(int x = bb_min_x; x <= bb_max_x; x++){
        float w = weights.at<float>(y-bb_min_y,x-bb_min_x);
        uchar val = original_img.at<uchar>(y,x);
        final_img.at<uchar>(y,x) = cv::saturate_cast<uchar>(w*val);
    }
}
对于(int y=bb_min_y;y一种简单方法:

// Create a weight image
int border=25;
cv::Mat_<float> rect=cv::Mat_<float>::zeros(height,width)
cv::rectangle(rect,cv::Rect(border/2,border/2,width-border,height-border),cv::Scalar(1),-1);
cv::Mat_<float> weights, kernel=cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(border,border));
int nnz = cv::countNonZero(kernel);
cv::filter2D(rect,weights,-1,kernel/nnz);
//创建权重图像
int-border=25;
cv::Mat_uuRect=cv::Mat_uRect::零(高度、宽度)
cv::矩形(矩形,cv::矩形(边框/2,边框/2,宽度边框,高度边框),cv::标量(1),-1);
cv::Mat_uu权重,kernel=cv::getStructuringElement(cv::变形椭圆,cv::大小(边框,边框));
int nnz=cv::countNonZero(内核);
cv::filter2D(rect,权重,-1,内核/nnz);
这将创建一个权重图像,如下所示:

然后使用它淡出图像:

for(int y = bb_min_y; y <= bb_max_y; y++){
    for(int x = bb_min_x; x <= bb_max_x; x++){
        float w = weights.at<float>(y-bb_min_y,x-bb_min_x);
        uchar val = original_img.at<uchar>(y,x);
        final_img.at<uchar>(y,x) = cv::saturate_cast<uchar>(w*val);
    }
}

对于(int y=bb_min_y;y)“高斯模糊值”是什么意思?你的描述听起来像是一个简单的淡出。模糊是不同的,交叉模糊的结果也会看起来“方形”。@vlad_tepesch我想你是对的,淡出就是我想要的“高斯模糊值”是什么意思是?你的描述听起来像是一个简单的淡出。模糊是不同的东西,交叉模糊的结果也会看起来“四四方方的”。@vlad_tepesch我想你是对的,淡出是我想要的