java实现中值滤波均值滤波拉普拉斯滤波
来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程

均值滤波
均值滤波的实现很简单,把滤波器的各个像素点相加在取平均就可以了。
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的变化的时候没有注意到这一点,做出来的图像失真很严重,找了半天原因。。。
java实现中值滤波均值滤波拉普拉斯滤波的更多相关文章
- [学习opencv]高斯、中值、均值、双边滤波
http://www.cnblogs.com/tiandsp/archive/2013/04/20/3031862.html [学习opencv]高斯.中值.均值.双边滤波 四种经典滤波算法,在ope ...
- OpenCv高斯,中值,均值,双边滤波
#include "cv.h" #include "highgui.h" #include <iostream> using namespace s ...
- Java实现中值问题
中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中间的值被称为中值. 使用Lomuto划分算法思想,此处引用<算法设计与分析基础>第 ...
- OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...
- 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1. 背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...
- 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 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, ...
- opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)
图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...
随机推荐
- uliweb框架数据库操作
先安装数据库和相关的库文件 sudo aptitude install python-setuptools sudo easy_install SQLAlchemy sudo easy_install ...
- 《记忆匣子》——网络编程jsp网页制作复习习笔记1
内容都在图里 哈哈哈 <%@ page language="java" contentType="text/html; charset=utf-8" pa ...
- 01- web应用与https协议
1. import socket server = socket.socket() server.bind(("127.0.0.1", 8800)) server.listen(5 ...
- 11 stark组件之delete按钮、filter过滤
1.构建批量删除按钮 1.admin中每个页面默认都有 2.stark之构建批量删除 3.coding {% extends 'base.html' %} {% block title %} < ...
- 解决Linux下编译.sh文件报错 unexpected operator Syntax error: word unexpected
执行一个脚本 发现报语法错误,但是在其他机器上运行都没有问题 唯一的区别就是 一个是centos机器 报错的是ubuntu 网上搜索了一下 因为Ubuntu默认的sh是连接到dash的,又因为da ...
- 微信小程序中的 hover-class
微信小程序中,可以用 hover-class 属性来指定元素的点击态效果.但是在在使用中要注意,大部分组件是不支持该属性的. 目前支持 hover-class 属性的组件有三个:view.button ...
- @RestController注解
@RestController注解其实就是@@Controller和@ResponseBody的组合:RESTFUL风格 看下源码: 当@ResponseBody放到Controller类上,改Con ...
- Jmeter接口测试(七)用例数据分离
之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...
- 利用for循环如何判定是水仙花数
水仙花数业内的大家可能听说过,但是对于初学者来讲,对于水仙花数还是比较陌生的. 首先要知道的是水仙花数的计算公式:153=1**3+5**3+3**3: 如何去判定这个数是否为水仙花数,最好的办法就是 ...
- OpenGL学习笔记(3) 纹理
关于纹理 一般游戏里的物体不一定都是纯色的物体,物体上面会有一些图片贴在上面,比如墙壁,箱子,地板,可以看到砖头.木板和大理石组成的图片,要把图片贴到计算机里的几何图形的话,就要把图片的颜色采样贴到几 ...