首先讲一下我对边缘检测原理的理解。一共分4步进行理解
- 图像数据
- 检测数据
- 形成数据
- 展示数据
图像数据
检测数据
首先,我们来开一下计算机是如何检测边缘的。以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函数就是一个一次函数y=kx,对其求一阶导数就是其斜率k,就是说边缘的一阶导数是一个常数,而由于非边缘的一阶导数为零,这样通过求一阶导数就能初步判断图像的边缘了。通常是X方向和Y方向的导数,也就是梯度。理论上计算机就是通过这种方式来获得图像的边缘。
形成数据
展示数据(形成图像)
效果图
运行代码
#pragma once
#include "cv.h"
#include <opencv2/highgui/highgui.hpp>
#include "main.h"
void mainCv();
#include "opencvCv.h"
using namespace cv;
void jSobel() {
IplImage *frame, *gray, *sobel;
frame = cvLoadImage("wood.jpg");//加载图像
gray = cvCreateImage(cvGetSize(frame), frame->depth, 1);
sobel = cvCreateImage(cvGetSize(frame), IPL_DEPTH_16S, 1);
cvNamedWindow("frame");
cvNamedWindow("gray");
cvNamedWindow("sobel");
cvCvtColor(frame, gray, CV_BGR2GRAY);//转为灰度
cvSobel(gray, sobel, 1, 0, 3);
IplImage *sobel8u = cvCreateImage(cvGetSize(sobel), IPL_DEPTH_8U, 1);
cvConvertScaleAbs(sobel, sobel8u, 1, 0);
cvShowImage("frame", frame);//显示图像
cvShowImage("gray", gray);
cvShowImage("sobel", sobel8u);
cvWaitKey(0);//等待
cvReleaseImage(&frame);
cvReleaseImage(&gray);
cvReleaseImage(&sobel);
cvDestroyWindow("frame");
cvDestroyWindow("gray");
cvDestroyWindow("sobel");
}
交流邮箱: