来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程
均值滤波
均值滤波的实现很简单,把滤波器的各个像素点相加在取平均就可以了。
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的变化的时候没有注意到这一点,做出来的图像失真很严重,找了半天原因。。。
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 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)
图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...
随机推荐
-
JavaScript学习笔记之数值
JavaScript内部,所有数字都是以64位浮点数形式储存,即使整数也是如此.(整数也是通过64浮点数的形式来存储的) 所以,1+1.0=2:且1===1.0的 浮点数不是精确的值,所以涉及小数的比 ...
-
代理延迟加载中proxy和弄no-proxy区别
Child <- many-to-one ->Parent class Child { private Parent paren ...
-
使用Excel对象模型在Excel单元格中设置不同的字体
效果是这样的: 首先找到这个单元格或区域Range cell,然后代码: ((Range)cell). Characters[, ].Font.Color = Color.Blue; ((Range) ...
-
Gradle Goodness: Skip Building Project Dependencies
If we use Gradle in a multi-module project we can define project dependencies between modules. Gradl ...
-
Python [Leetcode 345]Reverse Vowels of a String
题目描述: Write a function that takes a string as input and reverse only the vowels of a string. Example ...
-
http server v0.1_http_parse.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "mime.h&q ...
-
ACdream: ACfun
ACfun Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisti ...
-
“一切都是消息”--MSF(消息服务框架)之【请求-响应】模式
在前一篇, “一切都是消息”--MSF(消息服务框架)入门简介, 我们介绍了MSF基于异步通信,支持请求-响应通信模式和发布-订阅通信模式,并且介绍了如何获取MSF.今天,我们来看看如何使用MSF来做 ...
-
69个Spring面试题
Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...
-
监听F5刷新,添加路由前缀
为了解决ninx反向代理,添加路由,但最终react的route还是不认识,研究了半天做个记录: document.addEventListener("keydown",funct ...