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

均值滤波

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

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. 版本管理工具git与svn简介

    版本管理工具 版本管理工具简介 常见版本管理工具 cvs(Concurrent Versions System) vss(Visual SourceSafe) svn 常用的版本管理工具 git 流行 ...

  2. 小程序犯错(一):“ReferenceError: 模拟服务器传来的数据 is not defined”

    学习数据绑定,在onLoad中模拟服务器传数据时,报错:模拟服务器传来的数据 is not defined 我这里粗心的忘记注释说明了,如下: 把该行无关的错误数据注释或删除即可.这里提醒同学们,出现 ...

  3. 基于bootstrap的文本编辑器组件:Summernote

    Summernote官网地址 :https://summernote.org/ 这是官网的一个例子: <!DOCTYPE html> <html lang="en" ...

  4. 电子设备 Kindle如何删除书籍或漫画

    需要在亚马逊的官方设置好国家: 再在这里就可以管理了 要在kindle的上方小齿轮那里设置(飞行模式右边): 同步kindle 这样就能管理了

  5. Properties、ResourceBundle

    两个类都可以读取属性文件中以key/value形式存储的键值对,ResourceBundle读取属性文件时操作相对简单. Properties 该类继承Hashtable,将键值对存储在集合中.基于输 ...

  6. 利用BlockingCollection实现生产者和消费者队列,实现写文本

    最近开发几个小项目,需要把结果写到txt文件里面,并且按照时间进行分文件,由于对于效率要求较高,所以采用 生产者和消费者 模型来进行写出文本,线程中只需要添加队列就立即返回,而不需要等待写文件的时间 ...

  7. mvn本地部署命令行

    ---创建mvn项目 mvn archetype:generate 运行结果如下: ---调试mvn仓库 mvn archetype:generate –X 运行结果如下: ---创建依赖 mvn a ...

  8. 最具有性价比的语言javascript之二,学习篇

    先祝福各位,国庆假期愉快!前面写了一篇 最具有性价比的语言javascript之介绍篇,引起了不少的争议. 有些人javascript吐槽,埋怨.我目前做的都是后台系统.每个人的工作经历和兴趣爱好不一 ...

  9. 自动化jenkins报:ModuleNotFoundError: No module named 'common'

    直接执行脚本是没有问题,报如下错误: 你已经在run.py脚本加路径了为什么还会报这个错呢,就是你加的路径,应该在所有的包上面,才不会报这个错,如下: 注:以下是我的解决方法仅作参考.如果我的发表的内 ...

  10. TP里where的查询方式,比如or应该怎么写?

    这应该是个基础..只是我没有系统的学TP,所以用到了临时查了手册. 正常来说,thinkphp里的查询方式是: ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用数组或者对象来 ...