快速排序 一、 算法描述 快速排序是对冒泡排序的一种改进。在冒泡排序中,记录每次都是与相邻位置上的数据作比较,因此每次只能移动一个位置。而在快速排序中,记录的比较和移动都是从两端向中间进行的。 其主要思想:首先在待排序数组中选取一个基准值(作为

边缘检测算法的基本步骤(1)滤波。边缘检测主要基于导数计算,但受噪声影响。但滤波器在降低噪声的同时也导致边缘强度的损失。 (2)增强。增强算法将邻域中灰度有显著变化的点突出显示。一般通过计算梯度幅值完成。

(3)检测。但在有些图象中梯度幅值较大的并不是边缘点。最简单的边缘检测是梯度幅值阈值判定。

(4)定位。精确确定边缘的位置。

Canny边缘检测算法step1:用高斯滤波器平滑图象;

step2:用一阶偏导的有限差分来计算梯度的幅值和方向;

step3:对梯度幅值进行非极大值抑制;

step4:用双阈值算法检测和连接边缘。

效果图如下:

代码如下:最近在学习缓存算法, 就自己用java实现了一个LRU缓存算法,其实LRU可以直接用LinkedHashMap直接实现,本文采用HashMap来进行构造代码如下: *public class LRUCache{ private class CacheElemet{ private CacheElemet befor

package tools;

import java.awt.*;

import java.awt.image.*;

public class EdgeDetector extends Component {

public EdgeDetector() {

threshold1 = 50;

threshold2 = 230;

setThreshold(128);

setWidGaussianKernel(15);

}

public void process() throws EdgeDetectorException {

if (threshold < 0 || threshold > 255)

throw new EdgeDetectorException("The value of the threshold is out of its valid range.");

if (widGaussianKernel < 3 || widGaussianKernel > 40)

throw new EdgeDetectorException("The value of the widGaussianKernel is out of its valid range.");

width = sourceImage.getWidth(this);

height = sourceImage.getHeight(this);

picsize = width * height;

data = new int[picsize];

magnitude = new int[picsize];

orientation = new int[picsize];

float f = 1.0F;

canny_core(f, widGaussianKernel);

thresholding_tracker(threshold1, threshold2);

for (int i = 0; i < picsize; i++)

if (data[i] > threshold)

data[i] = 0xff000000;

else

data[i] = -1;

edgeImage = pixels2image(data);

data = null;

magnitude = null;

orientation = null;

}

private void canny_core(float f, int i) {

boolean flag = false;

boolean flag1 = false;

derivative_mag = new int[picsize];

float af4[] = new float[i];

float af5[] = new float[i];

float af6[] = new float[i];

data = image2pixels(sourceImage);

int k4 = 0;

do {

if (k4 >= i)

break;

float f1 = gaussian(k4, f);

if (f1 <= 0.005F && k4 >= 2)

break;

float f2 = gaussian((float) k4 - 0.5F, f);

float f3 = gaussian((float) k4 + 0.5F, f);

float f4 = gaussian(k4, f * 0.5F);

af4[k4] = (f1 + f2 + f3) / 3F / (6.283185F * f * f);

af5[k4] = f3 - f2;

af6[k4] = 1.6F * f4 - f1;

k4++;

} while (true);

int j = k4;

float af[] = new float[picsize];

float af1[] = new float[picsize];

int j1 = width - (j - 1);

int l = width * (j - 1);

int i1 = width * (height - (j - 1));

for (int l4 = j - 1; l4 < j1; l4++) {

for (int l5 = l; l5 < i1; l5 += width) {

int k1 = l4 + l5;

float f8 = (float) data[k1] * af4[0];

float f10 = f8;

int l6 = 1;

int k7 = k1 - width;

for (int i8 = k1 + width; l6 < j; i8 += width) {

f8 += af4[l6] * (float) (data[k7] + data[i8]);

f10 += af4[l6] * (float) (data[k1 - l6] + data[k1 + l6]);

l6++;

k7 -= width;

}

af[k1] = f8;

af1[k1] = f10;

}

}

float af2[] = new float[picsize];

for (int i5 = j - 1; i5 < j1; i5++) {

for (int i6 = l; i6 < i1; i6 += width) {

float f9 = 0.0F;

int l1 = i5 + i6;

for (int i7 = 1; i7 < j; i7++)

f9 += af5[i7] * (af[l1 - i7] - af[l1 + i7]);

af2[l1] = f9;

}

}

af = null;

float af3[] = new float[picsize];

for (int j5 = k4; j5 < width - k4; j5++) {

for (int j6 = l; j6 < i1; j6 += width) {

float f11 = 0.0F;

int i2 = j5 + j6;

int j7 = 1;

for (int l7 = width; j7 < j; l7 += width) {

f11 += af5[j7] * (af1[i2 - l7] - af1[i2 + l7]);

j7++;

}

af3[i2] = f11;

}

}

af1 = null;

j1 = width - j;

l = width * j;

i1 = width * (height - j);

for (int k5 = j; k5 < j1; k5++) {

for (int k6 = l; k6 < i1; k6 += width) {

int j2 = k5 + k6;

int k2 = j2 - width;

int l2 = j2 + width;

int i3 = j2 - 1;

int j3 = j2 + 1;

int k3 = k2 - 1;

int l3 = k2 + 1;

int i4 = l2 - 1;

int j4 = l2 + 1;

float f6 = af2[j2];

float f7 = af3[j2];

float f12 = hypotenuse(f6, f7);

int k = (int) ((double) f12 * 20D);

derivative_mag[j2] = k >= 256 ? 255 : k;

float f13 = hypotenuse(af2[k2], af3[k2]);

float f14 = hypotenuse(af2[l2], af3[l2]);

float f15 = hypotenuse(af2[i3], af3[i3]);

float f16 = hypotenuse(af2[j3], af3[j3]);

float f18 = hypotenuse(af2[l3], af3[l3]);

float f20 = hypotenuse(af2[j4], af3[j4]);

float f19 = hypotenuse(af2[i4], af3[i4]);

float f17 = hypotenuse(af2[k3], af3[k3]);

float f5;

if (f6 * f7 <= (float) 0

? Math.abs(f6) >= Math.abs(f7)

? (f5 = Math.abs(f6 * f12))

>= Math.abs(f7 * f18 - (f6 + f7) * f16)

&& f5

> Math.abs(f7 * f19 - (f6 + f7) * f15) : (

f5 = Math.abs(f7 * f12))

>= Math.abs(f6 * f18 - (f7 + f6) * f13)

&& f5

> Math.abs(f6 * f19 - (f7 + f6) * f14) : Math.abs(f6)

>= Math.abs(f7)

? (f5 = Math.abs(f6 * f12))

>= Math.abs(f7 * f20 + (f6 - f7) * f16)

&& f5

> Math.abs(f7 * f17 + (f6 - f7) * f15) : (

f5 = Math.abs(f7 * f12))

>= Math.abs(f6 * f20 + (f7 - f6) * f14)

&& f5 > Math.abs(f6 * f17 + (f7 - f6) * f13)) {

magnitude[j2] = derivative_mag[j2];

orientation[j2] = (int) (Math.atan2(f7, f6) * (double) 40F);

}

}

}

derivative_mag = null;

af2 = null;

af3 = null;

}

private float hypotenuse(float f, float f1) {

if (f == 0.0F && f1 == 0.0F)

return 0.0F;

else

return (float) Math.sqrt(f * f + f1 * f1);

}

private float gaussian(float f, float f1) {

return (float) Math.exp((-f * f) / ((float) 2 * f1 * f1));

}

private void thresholding_tracker(int i, int j) {

for (int k = 0; k < picsize; k++)

data[k] = 0;

for (int l = 0; l < width; l++) {

for (int i1 = 0; i1 < height; i1++)

if (magnitude[l + width * i1] >= i)

follow(l, i1, j);

}

}

private boolean follow(int i, int j, int k) {

int j1 = i + 1;

int k1 = i - 1;

int l1 = j + 1;

int i2 = j - 1;

int j2 = i + j * width;

if (l1 >= height)

l1 = height - 1;

if (i2 < 0)

i2 = 0;

if (j1 >= width)

j1 = width - 1;

if (k1 < 0)

k1 = 0;

if (data[j2] == 0) {

data[j2] = magnitude[j2];

boolean flag = false;

int l = k1;

do {

if (l > j1)

break;

int i1 = i2;

do {

if (i1 > l1)

break;

int k2 = l + i1 * width;

if ((i1 != j || l != i)

&& magnitude[k2] >= k

&& follow(l, i1, k)) {

flag = true;

break;

}

i1++;

} while (true);

if (!flag)

break;

l++;

}

while (true);

return true;

} else {

return false;

}

}

private Image pixels2image(int ai[]) {

java边缘检测算子代码_图像边缘检测(Canny 算法)的Java实现相关推荐

  1. java负载均衡原理_多种负载均衡算法及其 Java 代码实现

    首先给我们介绍下什么是负载均衡 负载均衡 树立在现有网络结构之上,它供给了一种廉价有用通明的办法扩展 网络设备和 效劳器的带宽.添加 吞吐量.加强网络数据处理才能.进步网络的灵敏性和可用性. 负载均衡 ...

  2. java积分管理系统代码_【全套设计下载】JAVA某店POS积分管理系统(源代码+论文)...

    [全套设计下载]JAVA某店POS积分管理系统(源代码+论文) 摘 要 开发一个大而复杂的POS积分管理软件系统,将它进行适当的分解,不但可以降低其复杂性,还可以减少开发工作量,降低开发成本,提高软件 ...

  3. 售票java代码_初探12306售票算法(二)-java代码实践

    周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Tic ...

  4. java俄罗斯方块简单代码_求个简单的俄罗斯方块java代码,初学者能看懂的

    展开全部 java版的我没32313133353236313431303231363533e4b893e5b19e31333330346531有,给你看个js版的: .d {margin :1px;w ...

  5. java品尝饮料代码_求解各位高手:用java解决品尝饮料问题

    展开全部 e68a84e8a2ad62616964757a686964616f31333264653432import java.util.ArrayList; import java.util.Li ...

  6. java课程 数独 文库_通俗易懂的数独算法(java版)

    数独算法 一 知识背景 无 二 绪言 偶尔玩下休闲益智小游戏,一方面可以舒解下心情,另一方面刺激下大脑皮层.百度了一下数独的起源和概念.说了那么多,看着就累.精简一下就是数字(0-9)填充游戏.不明白 ...

  7. NNDL 实验六 卷积神经网络(1)卷积 边缘检测之传统边缘检测算子和基于pytorch的Canny边缘检测

    文章目录 卷积神经网络(Convolutional Neural Network,CNN) 5.1 卷积 5.1.1 二维卷积运算 5.1.2 二维卷积算子 5.1.3 二维卷积的参数量和计算量 5. ...

  8. python图像边缘检测_python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的 ...

  9. java生成pdf图表_开发员指南:使用Java图表转换为PDF/JPG等图像

    Aspose.Cells for JavaExcel电子表格处理API,它允许Java开发人员在自己的Java应用程序中嵌入可读取.写入和操作Excel电子表格的能力,而无需依赖Microsoft E ...

最新文章

  1. tensorflow与keras的关系
  2. Javascipt数组去重的几种方式
  3. LeetCode 463. Island Perimeter
  4. ActionScript3.0面向对象编程的三个特征的论述?
  5. 光标移动事件。 gridview光标移动变色
  6. 计算机硬件配置及安装,电脑硬件及电脑配置知识大全
  7. eclipse各版本对应JDK版本要求
  8. 针对TCP连接的网络监控平台—AINA Lyzer
  9. 德鲁克谈《自我管理》笔记摘要
  10. 《用事实说话》阅读心得
  11. Python基础——魔法方法(一)
  12. centos安装ghostscript+PHP扩展imagick
  13. 微信授权APP第三方登陆(Android)
  14. java新版本新特性
  15. HTML5期末大作业:时尚服装购物网站设计——时尚服装购物商城(16页) 关于时尚购物HTML网页设计-----服装
  16. 函数<小罗爱c语言>
  17. 小罗学习笔记之安卓的存储路径(持续完善)
  18. 谜语,睇你识几多个?
  19. MCS-51 单片机的结构和工作原理
  20. 目前流行的个人台式计算机属于,[目前个人计算机的主要机型.doc

热门文章

  1. No.059<软考>《(高项)备考大全》【冲刺13】《软考高项极简知识点(2)》
  2. 二、Linux镜像软件的安装
  3. license程序设计 系统划分 及加密设计 加密算法调用openssl库
  4. 由圆上三点确定圆心和半径(附PythonMatlab程序)
  5. 敏捷开发:编写开发文档的利与弊
  6. JavaWeb----Ajax技术
  7. GitHub的使用方法
  8. linux内核虚拟内存之slub分配器
  9. 关于使用Navicat,Mysql Workbench,PowerDesigner根据mysql数据库生成ER(实体联系图)的解决方案的总结
  10. mysql如何重复数据合并_mysql合并相同字段,不同的拼接在起后