
边缘检测
Canny边缘检测
Canny边缘检测 (Canny Edge Detection)是一种多阶段的边缘检测算法,用于检测图像中的边缘。它 由John F. Canny在1986年提出,目的是通过减少噪声同时保持边缘信息来提高边缘检测的效果。
Canny边缘检测算法步骤
- 灰度化:将彩色图像转换为灰度图像,因为边缘信息通常不依赖于颜色。
- 高斯滤波:通过高斯滤波器去噪,减少图像噪声的干扰。
- 梯度计算:使用 Sobel算子计算图像的梯度(强度和方向),以找到边缘的位置。
- 非最大值抑制:抑制梯度强度较小的像素,保留局部最大值的边缘。
- 双阈值检测:使用两个阈值来判断哪些边缘是真正的边缘,哪些是噪声。根据边缘强度判断边缘是否属 于边缘或是噪声
- 边缘连接:将边缘连接起来,去除孤立的边缘,形成连续的边缘。
最主要是设置有2个阈值,大于搞阈值的会保留,低于低阈值的会去掉,介于之间的像素则会根据与周围像素的关系来决定是否保留
示例代码
java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class OpenCVTest {
public static void main( String[] args )
{
// 方式一加载OpenCV库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 图片文件路径
String imagePath = "C:\\Users\\Think\\Desktop\\3.jpg";
// 使用OpenCV加载图片,可以加第二个参数,是读取的类型,比如读取灰色图像
Mat image = Imgcodecs.imread(imagePath);
// 转换为灰度图像
Mat grayImage = new Mat();
Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);
// 使用Canny算法进行边缘检测
Mat edges = new Mat();
Imgproc.Canny(grayImage, edges, 50, 150);
// 显示边缘检测结果
HighGui.imshow("Edges", edges);
HighGui.waitKey(0);
HighGui.destroyAllWindows();
}
}
Laplacian边缘检测
Laplacian边缘检测是一种基于二阶导数的边缘检测方法,它通过计算图像灰度的二阶导数来检测图像 中的边缘。与一阶导数的边缘检测(如 Sobel或 Canny) 相比,Laplacian边缘检测可以捕捉到更多 细节,但也更容易受到噪声的干扰。
Laplacian操作原理:
Laplacian算子计算的是图像像素的二阶导数,它可以在图像的梯度变化快速的地方检测到边缘。在图 像处理中,Laplacian算子通常与高斯滤波结合使用,以去除噪声并平滑图像。
java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
/**
* 公众号:干货食堂
*/
public class Test {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//读取图像,使用灰度模式
Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png",Imgcodecs.IMREAD_GRAYSCALE);
//创建输出图像
Mat dst = new Mat();
//应用Laplacian 操作
//参数说明:
//1.输入图像(灰度图像)
//2.输出图像
//3.ddepth:输出图像深度,-1表示与输入图像相同
//4.ksize:Sobel核大小,推荐为3或5
Imgproc.Laplacian(src, dst, -1, 3);
//将图像转换回CV_8U类型(无符号8位整数)
Mat abs_dst = new Mat();
Core.convertScaleAbs(dst, abs_dst);
//保存结果图像
HighGui.imshow("before Image", src);
HighGui.imshow("after Image", abs_dst);
HighGui.waitKey(0);
HighGui.destroyAllWindows();
}
}