Java调用opencv边缘检测

简介: Java调用opencv边缘检测

canny算子



public static void testCanny(Mat image) {
  //高斯滤波
  Imgproc.GaussianBlur(image, image, new Size(3, 3), 0, 0);
  //灰度
  Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
  //一般来说,高阈值maxVal推荐是低阈值minVal的2~3倍
  int lowThresh=45;
  //边缘检测
  Imgproc.Canny(image, image,lowThresh, lowThresh*3,3);
  HighGui.imshow("Canny", image);
}
复制代码


Sobel算子



public static void testSobel(Mat image) {
  //高斯滤波
  Imgproc.GaussianBlur(image, image, new Size(3, 3), 0, 0);
  //灰度
  Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
    //横向
    Mat x = new Mat();
    /*src:源图像
     *dst:检测结果图像
     *ddepth:输出图像的深度
     *dx:x方向上的差分阶数
     *dy:y方向上的差分阶数
     *ksize:sobel核的大小,默认为3
     *scale:缩放因子
     *delta:结果存入输出图像前可选的delta值,默认为0
     *borderType:边界模式,默认BORDER_DEFAULT
     *
     *其中,输出图像的深度,支持如下src.depth()和ddepth的组合:
     *src.depth() = CV_8U         ddepth =-1/CV_16S/CV_32F/CV_64F
     *src.depth() = CV_16U/CV_16S ddepth =-1/CV_32F/CV_64F 
     *src.depth() = CV_32F        ddepth =-1/CV_32F/CV_64F
     *src.depth() = CV_64F        ddepth = -1/CV_64F
     */
    Imgproc.Sobel(image, x, CvType.CV_16S, 1, 0, 3, 1, 0, Core.BORDER_DEFAULT);
    //需要用convertScaleAbs()函数将其转回原来的uint8形式,否则将无法显示图像
    Core.convertScaleAbs(x, x); 
    HighGui.imshow("x", x);
    //竖向
    Mat y = new Mat();
    Imgproc.Sobel(image, y, CvType.CV_16S, 0, 1, 3, 1, 0, Core.BORDER_DEFAULT);
    Core.convertScaleAbs(y, y); 
    HighGui.imshow("y", y);
    //横竖向图像融合
    Mat xy = new Mat();
    Core.addWeighted(x, 0.5, y, 0.5, 0, xy);
  HighGui.imshow("xy", xy);
}
复制代码


Scharr滤波器



public static void testScharr(Mat image) {
  //高斯滤波
  Imgproc.GaussianBlur(image, image, new Size(3, 3), 0, 0);
  //灰度
  Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
    //横向
    Mat x = new Mat();
    /*src:源图像
     *dst:检测结果图像
     *ddepth:输出图像的深度
     *dx:x方向上的差分阶数
     *dy:y方向上的差分阶数
     *scale:缩放因子
     *delta:结果存入输出图像前可选的delta值,默认为0
     *borderType:边界模式,默认BORDER_DEFAULT
     *
     *其中,输出图像的深度,支持如下src.depth()和ddepth的组合:
     *src.depth() = CV_8U         ddepth =-1/CV_16S/CV_32F/CV_64F
     *src.depth() = CV_16U/CV_16S ddepth =-1/CV_32F/CV_64F 
     *src.depth() = CV_32F        ddepth =-1/CV_32F/CV_64F
     *src.depth() = CV_64F        ddepth = -1/CV_64F
     */
    Imgproc.Scharr(image, x, CvType.CV_16S, 1, 0,1, 0, Core.BORDER_DEFAULT);
    //需要用convertScaleAbs()函数将其转回原来的uint8形式,否则将无法显示图像
    Core.convertScaleAbs(x, x); 
    HighGui.imshow("x", x);
    //竖向
    Mat y = new Mat();
    Imgproc.Scharr(image, y, CvType.CV_16S, 0, 1, 1, 0, Core.BORDER_DEFAULT);
    Core.convertScaleAbs(y, y); 
    HighGui.imshow("y", y);
    //横竖向图像融合
    Mat xy = new Mat();
    Core.addWeighted(x, 0.5, y, 0.5, 0, xy);
  HighGui.imshow("xy", xy);
}
复制代码


Laplace算子



public static void testLaplacian(Mat image) {
  //高斯滤波
  Imgproc.GaussianBlur(image, image, new Size(3, 3), 0, 0);
  //灰度
  Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
  //边缘检测
  Mat dst = new Mat();
  /*src:源图像
     *dst:检测结果图像
     *ddepth:输出图像的深度
     *ksize:计算二阶导数的滤波器的孔径尺寸,必须为正奇数 等于1是四邻域算子,大于1改用八邻域算子
     *scale:缩放因子 计算拉普拉斯值时候可选的比例因子
     *delta:结果存入输出图像前可选的delta值,默认为0
     *borderType:边界模式,默认BORDER_DEFAULT
     */
  Imgproc.Laplacian(image, dst, CvType.CV_16S, 3, 1, 0, Core.BORDER_DEFAULT);
  Core.convertScaleAbs(dst, dst); 
  HighGui.imshow("Laplacian", dst);
}
复制代码


Threshold(固定阈值操作)



public static void testThreshold(Mat image) {
  /**
   *src 是输入的函数图像
     *dst 是输出的函数图像
     *thresh 阈值的具体值 
     *maxval 阈值类型的最大值
     *type 阈值类型
     *THRESH_BINARY = 0,过门限的为maxval其他取零
     *THRESH_BINARY_INV = 1,过门限的为取零,其他maxval
     *THRESH_TRUNC = 2,过门限的取门限,其他不变
     *THRESH_TOZERO = 3,过门限的不变,其他取零
     *THRESH_TOZERO_INV = 4,过门限的值取零其他不变
     *THRESH_MASK = 7,
     *THRESH_OTSU = 8,自动生成阀值,大于阀值的为255 ,小于阀值的为0
     *THRESH_TRIANGLE = 16;和我们设置的阀值大小没有关系,是自动计算出来的
   */
  Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
  HighGui.imshow("gry", image);
  Mat m=new Mat();
  Imgproc.threshold(image, m, 120, 255, Imgproc.THRESH_BINARY);
  HighGui.imshow("Threshold", m);
}
复制代码


adaptiveThreshold(自适应阈值操作)



public static void testAdaptiveThreshold(Mat image) {
  /**
   * src
   * dst
   * maxValue 给像素赋的满足条件的非零值
   * ADAPTIVE_THRESH_MEAN_C 计算均值时每个像素的权值是相等的
   * ADAPTIVE_THRESH_GAUSSIAN_C 计算均值时每个像素的权值根据其到中心点的距离通过高斯方程得到
   * int blockSize,  //计算阈值大小的一个像素的领域尺寸,取值为大于1的奇数
   * double C);  //减去加权平均值后的常数值,通常为正数,少数情况下也可为0或负数
   */
 //(Mat src, Mat dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)  
 //CV_8UC1 in function 'cv::adaptiveThreshold' 先灰度处理
  Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
  Imgproc.adaptiveThreshold(image, image, 200, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 9);
  HighGui.imshow("adaptiveThreshold", image);   
}


相关文章
|
5月前
|
算法 计算机视觉
OpenCV(二十六):边缘检测(二)
OpenCV(二十六):边缘检测(二)
43 0
|
5月前
|
计算机视觉
OpenCV(二十五):边缘检测(一)
OpenCV(二十五):边缘检测(一)
115 0
|
5月前
|
算法 计算机视觉 Python
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
320 0
|
4月前
|
机器学习/深度学习 Java 开发工具
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
85 0
|
4月前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
54 0
|
5月前
|
数据采集 Java 数据挖掘
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
|
4月前
|
Java 开发工具 计算机视觉
Java使用OpenCV3.2实现视频读取与播放
Java使用OpenCV3.2实现视频读取与播放
56 0
|
5月前
|
计算机视觉
【OpenCV】-边缘检测汇总示例
【OpenCV】-边缘检测汇总示例
|
5月前
|
算法 计算机视觉
OpenCV高斯差分技术实现图像边缘检测
OpenCV高斯差分技术实现图像边缘检测
|
5月前
|
算法 数据可视化 计算机视觉
opencv Canny边缘检测(python)
opencv Canny边缘检测(python)