Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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
Iphone 如何模糊图像,但保留锐利的对象边界?_Iphone_Ios_Image Processing_Uiimage - Fatal编程技术网

Iphone 如何模糊图像,但保留锐利的对象边界?

Iphone 如何模糊图像,但保留锐利的对象边界?,iphone,ios,image-processing,uiimage,Iphone,Ios,Image Processing,Uiimage,我想对UIImage执行“智能”模糊,其中内容模糊,但边缘保持锐利 例如,以下是我的原始图像: 下面是我希望在应用模糊后看到的: 如何在UIImage上进行这样的“智能”模糊?您在这里寻找的模糊称为双边模糊。与标准高斯模糊不同,根据周围像素与中心像素的相似程度,使用中心像素颜色平均周围像素的颜色。这会模糊对象的内部区域,但保留清晰的轮廓 在我的开源框架中,我有一个过滤器来实现这一点,称为GPUImageBilateralFilter。这是应用于图像时的输出(使用blurSize 1.0和di

我想对UIImage执行“智能”模糊,其中内容模糊,但边缘保持锐利

例如,以下是我的原始图像:

下面是我希望在应用模糊后看到的:


如何在UIImage上进行这样的“智能”模糊?

您在这里寻找的模糊称为双边模糊。与标准高斯模糊不同,根据周围像素与中心像素的相似程度,使用中心像素颜色平均周围像素的颜色。这会模糊对象的内部区域,但保留清晰的轮廓

在我的开源框架中,我有一个过滤器来实现这一点,称为GPUImageBilateralFilter。这是应用于图像时的输出(使用blurSize 1.0和distanceNormalizationFactor 1.6):

在我的结果和你的目标之间有一些细微的差别,但这可能是由于我使用的特定权重。通过调整这里的参数,您应该能够更接近上面的内容

OpenCV也有双边模糊过滤器,如果您想在这个框架之外使用它,您可以将源代码带到我的片段着色器并使用它来构建自己的OpenGL ES实现:

 uniform sampler2D inputImageTexture;

 const lowp int GAUSSIAN_SAMPLES = 9;

 varying highp vec2 textureCoordinate;
 varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES];

 uniform mediump float distanceNormalizationFactor;

 void main()
 {
     lowp vec4 centralColor;
     lowp float gaussianWeightTotal;
     lowp vec4 sum;
     lowp vec4 sampleColor;
     lowp float distanceFromCentralColor;
     lowp float gaussianWeight;

     centralColor = texture2D(inputImageTexture, blurCoordinates[4]);
     gaussianWeightTotal = 0.18;
     sum = centralColor * 0.18;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[0]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[1]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[2]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[3]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[5]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[6]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[7]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[8]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     gl_FragColor = sum / gaussianWeightTotal;
 }

你在这里寻找的模糊称为双边模糊。与标准高斯模糊不同,根据周围像素与中心像素的相似程度,使用中心像素颜色平均周围像素的颜色。这会模糊对象的内部区域,但保留清晰的轮廓

在我的开源框架中,我有一个过滤器来实现这一点,称为GPUImageBilateralFilter。这是应用于图像时的输出(使用blurSize 1.0和distanceNormalizationFactor 1.6):

在我的结果和你的目标之间有一些细微的差别,但这可能是由于我使用的特定权重。通过调整这里的参数,您应该能够更接近上面的内容

OpenCV也有双边模糊过滤器,如果您想在这个框架之外使用它,您可以将源代码带到我的片段着色器并使用它来构建自己的OpenGL ES实现:

 uniform sampler2D inputImageTexture;

 const lowp int GAUSSIAN_SAMPLES = 9;

 varying highp vec2 textureCoordinate;
 varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES];

 uniform mediump float distanceNormalizationFactor;

 void main()
 {
     lowp vec4 centralColor;
     lowp float gaussianWeightTotal;
     lowp vec4 sum;
     lowp vec4 sampleColor;
     lowp float distanceFromCentralColor;
     lowp float gaussianWeight;

     centralColor = texture2D(inputImageTexture, blurCoordinates[4]);
     gaussianWeightTotal = 0.18;
     sum = centralColor * 0.18;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[0]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[1]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[2]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[3]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[5]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[6]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[7]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     sampleColor = texture2D(inputImageTexture, blurCoordinates[8]);
     distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
     gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);
     gaussianWeightTotal += gaussianWeight;
     sum += sampleColor * gaussianWeight;

     gl_FragColor = sum / gaussianWeightTotal;
 }

回答得很好。喜欢包含开源项目和示例代码。@Brad Larson:我可以单独对图像的特定部分应用过滤效果吗?假设我的图像宽度为320,则不适用于整个图像。所以,我想将滤波效果从60像素增加到70像素,然后仅从200像素增加到220像素。因此,过滤效果不会应用于整个系统image@Brad拉森:+1谢谢,这非常有帮助:D我用它“升级”了一个高斯模糊着色器;我发现效果相当微妙,除非我将原始除数保留在最后一行(不通过与中心颜色的距离进行变换)。不过需要注意的是,虽然边缘更清晰,但有点褪色。答案很好。喜欢包含开源项目和示例代码。@Brad Larson:我可以单独对图像的特定部分应用过滤效果吗?假设我的图像宽度为320,则不适用于整个图像。所以,我想将滤波效果从60像素增加到70像素,然后仅从200像素增加到220像素。因此,过滤效果不会应用于整个系统image@Brad拉森:+1谢谢,这非常有帮助:D我用它“升级”了一个高斯模糊着色器;我发现效果相当微妙,除非我将原始除数保留在最后一行(不通过与中心颜色的距离进行变换)。不过值得注意的是,虽然边缘更清晰,但它们有点褪色。