OpenCV3 Java图像索贝尔Sobel处理(Imgproc.Sobel)

图形处理 09/12 阅读 202 views次 人气 0
摘要:

Sobel算子是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。

Sobel算法:

1、这是一种离散的卷积算法。由于数字图像是以离散的像素形式体现图像,故数字图像处理的实质就是离散数字的处理。

2、所谓卷积(convocation),是对所关心像素进行的离散处理,不仅根据卷积点原图像的数值,而且根据其周期像素的数值。平面卷积按照模板的大小和类型分类,典型的数字图像平面卷积模板采用3*3模板(即课程讨论的计算阵列)

3、采用卷积模板计算对应的图像处理结果(这里是sobel)时,将3*3模板在原数字图像上移动,每次一个像素(或横向,或纵向),以此得到全部图像像素的卷积计算结果,作为图像处理的结果。

4、采用3*3模板卷积时,必定有第1行,最后行,最左列和最右列的像素计算无法得到有效数值,称为卷积计算的边界处理,现代文献中,有将边界值填零,有将边界值填镜像,有将边界值做特定的逻辑运算的各种方案,至芯教材中采用填零的做法。

5、有了算法,如何将算法转变成电路,则是EDA的算法工程师的主要任务。在夏老师的代码中,采用了如下方式的结构以支持算法:

5.1、像素是8比特,数据总线是32比特。即一次存储器的读写访问一个字,可以访问四个像素。

5.2、采用了三个行的字寄存器分别进行前一行,当前行和后一行的一个取样列(字宽度,即4个字节/像素)

5.3、这样在600宽度的图像中,就有0~149个取样列

5.4、在每次取样后,进行对应的移位操作,在整个计算流水线上(含行寄存器移出,计算阵列移动,导数计算,绝对值计算,结果寄存器的移动)移动一个字节/像素。

5.5、因此,取样行从0行,0列开始,到398行,149列终止,以完成一个图像帧的计算。


代码案例:

package com.what21.opencv.demo;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Sobel {

	public static void main(String[] args) {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		
		Mat src=Imgcodecs.imread("D:/ShareData/internet.jpg");
		//读取图像到矩阵中,取灰度图像
		if(src.empty()){
			return ;
		}
		try{
			Mat dst = src.clone();
			//复制矩阵进入dst
			Imgproc.Sobel(src,dst,-1,0,1);
			Imgcodecs.imwrite("D:/ShareData/internet.sobel.jpg", dst);
		}catch(Exception e){
			e.printStackTrace();
		}

	}

}


评论

该文章不支持评论!

分享到: