图形处理-边缘检测

// 边缘检测.cpp : 定义控制台应用程序的入口点。


#include "stdafx.h"
#include"cv.h"
#include"highgui.h"
#include <stdio.h>  
int a = 1;
using namespace cv;
using namespace std;
//拉普拉斯/
IplImage *mid(IplImage *&imag)
{
IplImage *imag2 = cvCreateImage(cvSize(imag->width, imag->height), imag->depth, imag->nChannels);
uchar *p = (uchar *)imag2->imageData;
int i, j;
int x, y;
uchar k, m;
for (x = 1; x < (imag->height) - 1; x++)
for (y = 1; y < (imag->width) - 1; y++)
{
uchar  pix[100];
int t = 0;
if (x == 1 || x == 255)
p[(x - 1)*(imag->widthStep) + y] = 255;
if (y == 1 || y == 255)
p[(x - 1)*(imag->widthStep) + y] = 255;
if (x>1 && x<255 && y>1 && y < 255)


{
for (i = -1; i < 2; i++)
for (j = -1; j < 2; j++)
{
pix[t++] = ((uchar *)imag->imageData)[(x + i - 1)*imag->widthStep + y + j];


};
k = abs(pix[1] + pix[3] + pix[5] + pix[7] - 4 * pix[4]);
/*if (k>20)*/
p[x*(imag->widthStep) + y] = k;
/* else
p[x*(imag->widthStep) + y] = 0;*/




};


}


return imag2;
};


///罗伯特梯度///
IplImage *robert(IplImage *&imag) //2*2方格
{
IplImage *imag5 = cvCreateImage(cvSize(imag->width, imag->height), imag->depth, imag->nChannels);
uchar *p = (uchar *)imag5->imageData;
int i, j;
int x, y;
uchar k, m;
for (x = 1; x < (imag->height) - 1; x++)
for (y = 1; y < (imag->width) - 1; y++)
{
uchar  pix[100];
int t = 0;
for (i = -1; i < 1; i++)
for (j = -1; j < 1; j++)
{
pix[t++] = ((uchar *)imag->imageData)[(x + i)*imag->widthStep + y + j];
}

k = abs(pix[0] - pix[3]) + abs(pix[1] - pix[2]);   ///另一种算法


m = sqrt((pix[0] - pix[3])*(pix[0] - pix[3]) + (pix[1] - pix[2])*(pix[1] - pix[2]));
//if (m>=15)
p[(x-1)*(imag->widthStep) + y] = m;





}


return imag5;
};
///Sobel算子边缘
IplImage *sobel(IplImage *&imag) 
{
IplImage *imag6 = cvCreateImage(cvSize(imag->width, imag->height), imag->depth, imag->nChannels);
uchar *p = (uchar *)imag6->imageData;
int i, j;
int x, y;
uchar k, m,s,t;
for (x = 1; x < (imag->height) - 1; x++)
for (y = 1; y < (imag->width) - 1; y++)
{
uchar  pix[100];
int t = 0;
if (x == 1 || x == 255)
p[(x - 1)*(imag->widthStep) + y] = 255;
if (y == 1 || y == 255)
p[(x - 1)*(imag->widthStep) + y] = 255;
if (x>1 && x<255 && y>1 && y < 255)


{
for (i = -1; i < 2; i++)
for (j = -1; j < 2; j++)
{
pix[t++] = ((uchar *)imag->imageData)[(x + i-1)*imag->widthStep + y + j];

}
s = (pix[2] + 2 * pix[5] + pix[8]) - (pix[0] + 2 * pix[3] + pix[6]);
t = (pix[0] + 2 * pix[1] + pix[2]) -(pix[6] + 2 * pix[7] + pix[8]);
m = sqrt((s)*(s) + (t)*(t));
//if (m >= 55  )
p[(x - 1)*(imag->widthStep) + y] = m;


 }
}




return imag6;
};


//直方图/


IplImage *Hist(IplImage * pSrcImage, IplImage *pGrayImage)
{
pGrayImage = cvCreateImage(cvGetSize(pSrcImage), pSrcImage->depth, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
int size = 256;
float ranges[] = { 0, 256 };
float *pfRanges[] = { ranges };
float max_value = 0;
int b = 1;
CvHistogram* originalPictureHist = cvCreateHist(1, &size, CV_HIST_ARRAY, pfRanges);
cvCalcHist(&pGrayImage, originalPictureHist);
IplImage* originalPictureHistImage = cvCreateImage(cvSize(256, 256), 8, 1);
cvRectangle(originalPictureHistImage, cvPoint(0, 0), cvPoint(originalPictureHistImage->width, originalPictureHistImage->height), CV_RGB(255, 255, 255));
cvGetMinMaxHistValue(originalPictureHist, NULL, &max_value, 0, 0);
for (int i = 0; i < 255; i++)
{
float fHistValue = cvQueryHistValue_1D(originalPictureHist, i);
int realHeight = cvRound(fHistValue * 150 / max_value);
cvRectangle(originalPictureHistImage, cvPoint(i, 256 - 1), cvPoint(i + 1, 256 - realHeight), cvScalar(i, 0, 0, 0), CV_FILLED);
}


switch (a)
{
case 1:cvShowImage("原直方图", originalPictureHistImage);
cvMoveWindow("原直方图", 100, 400);
case 2: cvShowImage("拉普拉斯直方图", originalPictureHistImage);
cvMoveWindow("拉普拉斯直方图", 400, 400);


case 3:cvShowImage("Robert算子直方图", originalPictureHistImage);
cvMoveWindow("Robert算子直方图", 700, 400);


default:cvShowImage("sobel算子直方图", originalPictureHistImage);
cvMoveWindow("sobel算子直方图", 1000, 400);




break;
}
return pSrcImage, pGrayImage;






}  




int main()
{


int h, w, s, c;
uchar * data;
IplImage* img1 = cvLoadImage("C:/Users/Administrator/Desktop/图片/lena.bmp", CV_LOAD_IMAGE_GRAYSCALE);
cvNamedWindow("原图", CV_WINDOW_AUTOSIZE);
cvMoveWindow("原图", 100, 100);
cvShowImage("原图", img1);


h = img1->height;
w = img1->width;
s = img1->widthStep;
c = img1->nChannels;
data = (uchar *)img1->imageData;


cout << h + 1 << ' ' << w + 1 << ' ' << s << ' ' << c << endl;


IplImage * imag2 = img1;
IplImage * img3, *img4,*img8;
/拉普拉斯
img3 = mid(imag2);
cvNamedWindow("拉普拉斯", CV_WINDOW_AUTOSIZE);
cvMoveWindow("拉普拉斯", 400, 100);
cvShowImage("拉普拉斯", img3);
cvSaveImage("C:\\Users\\Administrator\\Desktop\\图片\\lena_lashi.bmp", img3);


///罗伯特梯度//
IplImage * imag5 = img1;
img4 = robert(imag5);
cvNamedWindow("罗伯特梯度", CV_WINDOW_AUTOSIZE);
cvMoveWindow("罗伯特梯度", 700, 100);
cvShowImage("罗伯特梯度", img4);
cvSaveImage("C:\\Users\\Administrator\\Desktop\\图片\\lena_robert.bmp", img4);
sobel算子/
IplImage * imag6 = img1;
img8 = sobel(imag6);
cvNamedWindow("sobel", CV_WINDOW_AUTOSIZE);
cvMoveWindow("sobel", 1000, 100);
cvShowImage("sobel", img8);
cvSaveImage("C:\\Users\\Administrator\\Desktop\\图片\\lena_sobel.bmp", img8);
/画直方图//
IplImage* pSrcImage, *pGrayImage;
pGrayImage = 0;
pSrcImage = cvLoadImage("C:\\Users\\Administrator\\Desktop\\图片\\lena.bmp");
Hist(pSrcImage, pGrayImage);
a++;
pSrcImage = cvLoadImage("C:\\Users\\Administrator\\Desktop\\图片\\lena_lashi.bmp");
Hist(pSrcImage, pGrayImage);
a++;
pSrcImage = cvLoadImage("C:\\Users\\Administrator\\Desktop\\图片\\lena_robert.bmp");
Hist(pSrcImage, pGrayImage);
a++;
pSrcImage = cvLoadImage("C:\\Users\\Administrator\\Desktop\\图片\\lena_sobel.bmp");
Hist(pSrcImage, pGrayImage);
cvWaitKey();
return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值