滤镜新体验,巧用卷积--java

也许你的滤镜已到瓶颈,总有些效果无法完成。牢记一点,遇事不决,求助数学!若采用数学中的卷积概念,即可成功。

卷积具体概念可求助度娘,这里简单说明一下使用方式。

创建一个由前人计算完备的卷积核,用它的中心与所求像素点重叠,然后对应位置相乘,再全部相加便可得到卷积。

也许这样听来比较抽象,无法想象它的效果,给你有图有真相。

而卷积处理后的浮雕效果:

 咱们可以开始做了:

public int juanji(int[][] karr/*卷积核,方便切换*/,int[][] tem){
    int kk=0;
    for(int i=0;i< karr.length;i++){
        for(int j=0;j<karr[i].length;j++){
            kk+=karr[i][j]*tem[i][j]/*计算一次卷积,所需知的像素点*/;
        }
    }
    return kk;
}//卷积计算方法

已经写好一个像素点的计算了!开始用于整张图象!

public void bejuan(Graphics g,int[][] karr){
    int[][] imgpix=getpix("C:\\Users\\27259\\Desktop\\aniya.png");//得到图片像素
    int[][] temr=new int[karr.length][karr[0].length];
    int[][] temg=new int[karr.length][karr[0].length];
    int[][] temb=new int[karr.length][karr[0].length];/*求单个像素点卷积,所需用到的像素点*/
    /*值得注意的是,要将R,G,B拆分求卷积,有更好的效果*/
    int[] ll=new int[3];//分开存储R,G,B值
    for(int i=0;i< imgpix.length- karr.length+1/*所求像素点最大范围*/;i++){
        for(int j=0;j< imgpix[0].length-karr[0].length+1/*所求像素点最大范围*/;j++){
           for(int a=0;a<karr.length;a++){
                for(int b=0;b<karr.length;b++){
                    divide(imgpix[i+a][j+b]);
                    temr[a][b]=red;
                    temg[a][b]=green;
                    temb[a][b]=blue;
                }
            }
            ll[0]=juanji(karr,temr);
            ll[1]=juanji(karr,temg);
            ll[2]=juanji(karr,temb);//得到卷积完成的R,G,B值
            for(int n =0;n<3;n++){
                if(ll[n]>255){
                    ll[n]=255;
                }
                if(ll[n]<0){
                    ll[n]=0;
                }
            }//记得判断R,G,B值,防止越界
            Color cl=new Color(ll[0],ll[1],ll[2]);
            g.setColor(cl);//设置卷积好了的颜色
            g.fillRect(500+i,200+j,1,1);
        }
    }
}

好了还有别的效果:

锐化:

卷积核:

int[][] karr1={
  
  {-1,-1,-1},{-1,9,-1},{-1,-1,-1}};

 水平轮廓:

卷积核:

int[][] karr={
  
  {-1,-1,-1},{-1,8,-1},{-1,-1,-1}};

Let's try!!!

猜你喜欢

转载自blog.csdn.net/AkinanCZ/article/details/125451375