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);   
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享