opengl对图像进行腐蚀和膨胀

效果图


膨胀的原理:

膨胀就是求局部最大值的操作,就是给定一个核对图像进行卷积操作,见下图



将核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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值