效果图
膨胀的原理:
膨胀就是求局部最大值的操作,就是给定一个核对图像进行卷积操作,见下图
将核B与图像A卷积,即计算B覆盖区域的像素点的最大值,并把这个最大值赋给参考点指定的像素,这样
就会使图像中的高亮区域逐渐增长,这就是膨胀的效果,膨胀的数学表达式
opengl中膨胀效果的shader实现
varying vec2 V_Texcoord;
uniform sampler2D U_MainTexture;
void main()
{
vec4 maxValue=vec4(0.0);
int coreSize=3;//卷积核的尺寸 3x3
int halfCoreSize=coreSize/2;
float texelOffset=1/100.0;//纹理坐标偏移量
for(int y=0;y<coreSize;y++)
{
for(int x=0;x<coreSize;x++)
{
//计算卷积核覆盖区域像素点的最大值
vec4 color=texture2D(U_MainTexture,V_Texcoord+vec2((-halfCoreSize+x)*texelOffset,(-halfCoreSize+y)*texelOffset));
maxValue=max(maxValue,color);
}
}
gl_FragColor=maxValue;
}
腐蚀的原理:
腐蚀和膨胀相反,就局部最小值,腐蚀示意图
腐蚀的数学表达式
opengl中腐蚀的shader实现
varying vec2 V_Texcoord;
uniform sampler2D U_MainTexture;
void main()
{
vec4 minValue=vec4(1.0);
int coreSize=6;
int halfCoreSize=coreSize/2;
float texelOffset=1/100.0;
//遍历核
for(int y=0;y<coreSize;y++)
{
for(int x=0;x<coreSize;x++)
{
//计算核B覆盖区域的像素点的最小值
vec4 currentAlpha=texture2D(U_MainTexture,V_Texcoord+vec2((-halfCoreSize+x)*texelOffset,(-halfCoreSize+y)*texelOffset));
minValue=min(minValue,currentAlpha);
}
}
gl_FragColor=minValue;
}
渲染入口
#include <windows.h>
#include "glew.h"
#include <stdio.h>
#include <math.h>
#include "utils.h"
#include "GPUProgram.h"
#include "ObjModel.h"
#include "FBO.h"
#include "FullScreenQuad.h"
#include "Glm/glm.hpp"
#include "Glm/ext.h