java实现中值滤波均值滤波拉普拉斯滤波

目录

  • 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程

    • 均值滤波
    • 中值滤波
    • 拉普拉斯滤波
    • Sobel滤波
    • 注意

来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程

均值滤波

均值滤波的实现很简单,把滤波器的各个像素点相加在取平均就可以了。

public static int getAVEcolor(int x,int y,BufferedImage bi)
    {
        int color=0;
        int r=0,g=0,b=0;
        for(int i=x-1;i<=x+1;i++)
            for(int j=y-1;j<=y+1;j++)
            {
                color=bi.getRGB(i, j);
                r += (color >> 16) & 0xff;
                g += (color >> 8) & 0xff;
                b += color & 0xff;
            }
         int ia = 0xff;
         int ir = (int)(r/9);
         int ig = (int)(g/9);
         int ib = (int)(b/9);
         color = (ia << 24) | (ir << 16) | (ig << 8) | ib;
            return color;
    }

效果如下图

中值滤波

取滤波器的各个像素点的中值。如3*3的滤波器就取排列后的第5个数

public static int getMidcolor(int x,int y,BufferedImage bi)
    {
        int color=0;
        int m=0;
        int a[]=new int[9];
        for(int i=x-1;i<=x+1;i++)
            for(int j=y-1;j<=y+1;j++)
            {
                color=bi.getRGB(i, j);
                a[m]=color;
                m++;
            }
        Arrays.sort(a);
        color=a[5];

        return color;
    }

效果如下图

拉普拉斯滤波

其实也是各个像素点的基本运算

//LPLS滤波中间权重为8
    public static int getLPLScolor8(int x,int y,BufferedImage bi)
    {
        int color=0,r=0,g=0,b=0;
        for(int i=x-1;i<=x+1;i++)
            for(int j=y-1;j<=y+1;j++)
            {
                if(i!=x&&j!=y)
                {
                color=bi.getRGB(i, j);
                r -= (color >> 16) & 0xff;
                g -= (color >> 8) & 0xff;
                b -= color & 0xff;
                }
                else if(i==x&&j==y)
                {
                color=bi.getRGB(i, j);
                r += 8*((color >> 16) & 0xff);
                g += 8*((color >> 8) & 0xff);
                b += 8*(color & 0xff);
                }
            }
        color=bi.getRGB(x, y);
        r += (color >> 16) & 0xff;
        g += (color >> 8) & 0xff;
        b += color & 0xff;
        int ia = 0xff;  

        color = (ia << 24) | (clamp(r) << 16) | (clamp(g) << 8) | clamp(b); 

        return color;
    }
//LPLS中间权重为4
    public static int getLPLScolor4(int x,int y,BufferedImage bi)
    {
        int color=0,r=0,g=0,b=0;
        color=bi.getRGB(x, y+1);
        r -= (color >> 16) & 0xff;
        g -= (color >> 8) & 0xff;
        b -= color & 0xff;
        color=bi.getRGB(x-1, y);
        r -= (color >> 16) & 0xff;
        g -= (color >> 8) & 0xff;
        b -= color & 0xff;
        color=bi.getRGB(x+1, y);
        r -= (color >> 16) & 0xff;
        g -= (color >> 8) & 0xff;
        b -= color & 0xff;
        color=bi.getRGB(x, y-1);
        r -= (color >> 16) & 0xff;
        g -= (color >> 8) & 0xff;
        b -= color & 0xff;
        color=bi.getRGB(x, y);
        r += 5*((color >> 16) & 0xff);
        g += 5*((color >> 8) & 0xff);
        b += 5*(color & 0xff);

        int ia = 0xff;
        color = (ia << 24) | (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);
        return color;
    }

LPLS权重4

LPLS权重8

Sobel滤波

主要用于提取边缘信息,当然也是数学变化

public static int getSobelcolor(int x,int y,BufferedImage bi)
    {
        int color=0;
        int r1=0,g1=0,b1=0;
        int r2=0,g2=0,b2=0;
        int []a1= {-1,-2,-1,0,0,0,1,2,1};
        int []a2= {1,0,-1,2,0,-2,1,0,-1};
        int m=0;
        for(int i=x-1;i<=x+1;i++)
            for(int j=y-1;j<=y+1;j++)
            {
                color=bi.getRGB(i, j);
                r1 += a1[m]*((color >> 16) & 0xff);
                g1 += a1[m]*((color >> 8) & 0xff);
                b1 += a1[m]*(color & 0xff);
                r2 += a2[m]*((color >> 16) & 0xff);
                g2 += a2[m]*((color >> 8) & 0xff);
                b2 += a2[m]*(color & 0xff);
                m+=1;
            }
        r1=(int)Math.sqrt(r1*r1+r2*r2);
        g1=(int)Math.sqrt(g1*g1+g2*g2);
        b1=(int)Math.sqrt(b1*b1+b2*b2);
        int ia = 0xff;
        color = (ia << 24) | (clamp(r1) << 16) | (clamp(g1) << 8) | clamp(b1);
        return color;
    }

结果

他可以用于图像转线稿哎

转化后的线稿

应该还要去除下噪声才好用

注意

用java读取的是RGB值,要做位运算转变成在R,G,B的分量。
注意转换后的图像的灰度值要小于255大于0,灰度值不在此区间的要让他等于255或0。一开始做LPLS的变化的时候没有注意到这一点,做出来的图像失真很严重,找了半天原因。。。

完整demo

原文地址:https://www.cnblogs.com/zzc2018/p/10582092.html

时间: 2024-11-13 06:08:18

java实现中值滤波均值滤波拉普拉斯滤波的相关文章

OpenCv高斯,中值,均值,双边滤波

#include "cv.h" #include "highgui.h" #include <iostream> using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat src = imread("misaka.jpg"); Mat dst; //参数是按顺序写的 //高斯滤波 //src:输入图像 //dst:输出图像 //Siz

均值滤波,中值滤波,最大最小值滤波

http://blog.csdn.net/fastbox/article/details/7984721 讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值 滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这 里–http://blog.csdn.net/jia20003/article/details/7038938 均值滤波: 均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高 频信号将会去掉,因此可以

【opencv学习笔记1】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性. 图像滤波的目的 a.消除图像中混入的噪声 b.为图像识别抽取出图像特征 图像滤波的要求 a.不能损坏图像轮廓及边缘 b.图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就以此举一个例

opencv初学习-椒盐噪声-中值滤波-均值滤波-腐蚀膨胀

#include <opencv2\opencv.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgcodecs\imgcodecs.hpp>#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<iomanip>void salt(cv

【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性.(摘自网络) 图像滤波的目的 1,消除图像中混入的噪声 2,为图像识别抽取出图像特征 图像滤波的要求 1,不能损坏图像轮廓及边缘 2,图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就

线性均值滤波和中值滤波的比较

线性均值滤波和中值滤波对信号处理的比较结果如下: from: http://blog.csdn.net/abcjennifer/article/details/7410314

中值滤波和均值滤波C++代码

均值滤波和中值滤波代码 2008-11-24 16:07:36|  分类: 编程|举报|字号 订阅 //------------------均值滤波器 bool FilterAV(unsigned char *image,int height,int width) { int i,j; unsigned char *p=(unsigned char*)malloc(height*width); for(i=1;i<height-1;i++) { for(j=1;j<width-1;j++) {

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)

opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波

#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; //均值滤波模糊处理int demo_blur(){ char win1[] = "window1"; char win2[] = "window2"; Mat img1, img2; img1 = imread("D://images//4.jpg&quo