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

均值滤波

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

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. mac最常用快捷键

    本人使用的是18款512g的macbookpro<后续简称mbp>,已升级最新mojave系统. 以下是我平时记录.也是使用最多的快捷键,惠存.     1.切换拼音和字母 control ...

  2. Symbol 实现属性私有化的方式

    //一般通过私有变量来保存私有属性 通过原型方法(getSex)来访问该属性 实现该属性只能被访问无法直接改变属性值 const Person = (function(){ let _sex = &q ...

  3. day 87 Vue学习六之axios、vuex、脚手架中组件传值

      本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的使用 Axios 是一个基于 promise 的 HT ...

  4. 由Handle转换为控件

    Control c = Control.FromHandle(this.textBox1.Handle); TextBox f = c as TextBox;

  5. 大数据入门第五天——离线计算之hadoop(上)概述与集群安装

    一.概述 根据之前的凡技术必登其官网的原则,我们当然先得找到它的官网:http://hadoop.apache.org/ 1.什么是hadoop 先看官网介绍: The Apache™ Hadoop® ...

  6. WPF设置全局字体和字体嵌入

    原文:WPF设置全局字体和字体嵌入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CLeopard/article/details/40590373 ...

  7. 自己写个activex控件,如何知道他的classid(转载)

    在网页里用的时候需要知道他的classid我在代码中看到有 const GUID CDECL BASED_CODE _tlid = { 0x89201950, 0x2CAC, 0x4CF7, { 0x ...

  8. Angular基础开始

    这个我是想用Angular写一个简单的WebApp,这个是一个简简单单路由: 公共模板--index.html: <!DOCTYPE html> <html ng-app='myAp ...

  9. xgboost: 速度快效果好的boosting模型

    转自:http://cos.name/2015/03/xgboost/ 本文作者:何通,SupStat Inc(总部在纽约,中国分部为北京数博思达信息科技有限公司)数据科学家,加拿大Simon Fra ...

  10. 由 Session 和 Cookie 的区别说起

    Session 和 Cookie 有什么区别? 最近面试被问到这个问题,和面试官一番讨论了解到面试官心里的答案后,我不太满意. 面对上面的问题,如果是刚毕业时的我,一定会毫不犹豫说出 Cookie 是 ...