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

均值滤波

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

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;
}![](https://img2018.cnblogs.com/blog/1475969/201903/1475969-20190324224125916-744413606.jpg)

效果如下图

中值滤波

取滤波器的各个像素点的中值。如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

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

  1. [学习opencv]高斯、中值、均值、双边滤波

    http://www.cnblogs.com/tiandsp/archive/2013/04/20/3031862.html [学习opencv]高斯.中值.均值.双边滤波 四种经典滤波算法,在ope ...

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

    #include "cv.h" #include "highgui.h" #include <iostream> using namespace s ...

  3. Java实现中值问题

    中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中间的值被称为中值. 使用Lomuto划分算法思想,此处引用<算法设计与分析基础>第 ...

  4. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  5. opencv实现图像邻域均值滤波、中值滤波、高斯滤波

    void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...

  6. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

  7. 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波) 3. cv2.Guassiannblur(进行高斯滤波) 4. cv2.medianBlur(进行中值滤波)

    1.cv2.blur(img, (3, 3))  进行均值滤波 参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小 2. cv2.boxfilter(img, -1, (3, ...

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

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  9. opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)

    图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...

随机推荐

  1. C语言中关于逗号运算符的理解

    在C语言中运算符有很多,包括算数运算符.关系运算符.赋值运算符.位运算符.逻辑运算符.三目运算符.sizeof运算符.逗号运算符等等,那今天我们就重点来给大家讨论一下关于逗号运算符的一些运算规则. 首 ...

  2. linux 用时间创建文件夹

    命令: mkdir `date +%Y%m%d%H%M%S`

  3. linux下使用shell脚本获取终端宽度

    获取终端大小时候的学习 学习日期:2018/11/3 问题来源: 在写shell脚本时想输出一行占满整个终端屏幕宽度的 横杠 发现for循环会导致执行缓慢 解决方法: 使用yes 命令 sed '50 ...

  4. temp-2017-4-20

    ------- p{font-size:20px;color:red;} uuuuuuuuuuu package com.wgscd.gwang.myapplication; /** Created ...

  5. Dataguard学习笔记

    主库和备库之间的redo log传递,可以通过如下方式实现: 在主库端: log_archive_dest_1='主库本地路径' log_archive_dest_2='备库的net service名 ...

  6. uefi+gpt安装双系统

    uefi+gpt:不要用easybcd!不起作用.找不到.mbr文件. win10空出一个盘: 制作ubuntu启动盘: 分区设置 挂载点 分区大小 新分区类型 新分区位置 用于 / 22000MB ...

  7. OpenStack入门篇(二十一)之VXLAN原理

    1.Vxlan的概念 VXLAN 全称 Virtual eXtensible Local Area Network.(虚拟扩展本地局域网)VXLAN 提供与 VLAN 相同的以太网二层服务,但是拥有更 ...

  8. 微信小程序:设置页面计时自动跳转

    一.功能描述 当出发某一事件后,希望在规定的时间后自动执行另一事件,比如页面跳转功能. 二.代码实现 使用setTimeout函数,单位为毫秒ms setTimeout(function(){ wx. ...

  9. P3164 [CQOI2014]和谐矩阵

    P3164 [CQOI2014]和谐矩阵 乱写能AC,暴力踩标程(雾 第一眼 诶这题能暴力枚举2333!!! 第二眼 诶这题能高斯消元!那只需要把每个位置的数给设出来就能够列方程了!然后就可以\(O( ...

  10. SpringMVC 异常信息ASM ClassReader failed to parse class file的问题解决

    1.  环境信息: Spring 3.2.0,  JDK 1.8.0 2.  运行简单的程序,出现以下错误信息: 2.  运行简单的程序,出现以下错误信息: Caused by: org.spring ...