图形处理-边缘检测
来源:互联网 发布:水印相机软件 编辑:程序博客网 时间:2024/05/22 08:22
// 边缘检测.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;
}
#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 0
- 图形处理-边缘检测
- VC6.0图形处理7--边缘检测
- 数字图像处理 边缘检测
- C++图形边缘检测与区域提取
- c#图像处理-边缘检测
- 数字图像处理:8.边缘检测
- 【图像处理】图像边缘检测
- 图像处理与边缘检测
- 数字图像处理之边缘检测
- 图像处理------Canny边缘检测
- 图像处理25:边缘检测
- 数字图像处理之边缘检测,图像分割
- 图像处理常用边缘检测算子总结
- 图像处理常用边缘检测算子总结
- dsp图像处理Prewitt算子边缘检测
- 图像处理常用边缘检测算子总结
- 灰度图,缩放处理,Canny边缘检测
- 图像处理之边缘检测概述
- Linux的用户组和文件权限详解
- 顺序表所有元素逆置
- 【题解】吉哥系列故事——恨7不成妻
- Spring和JAVA
- WCF架构学习01-WebService篇
- 图形处理-边缘检测
- Linux磁盘管理的相关命令
- redis与Mysql的数据一致性
- Android7.0 SDcard无法创建文件夹解决办法
- JMeter压力测试初级教程
- Opencv的安装使用 和 灰度化和二值化的主要实现
- Linux下用户组和文件权限详解
- 显示格子物品信息
- c++知识点(剑指offer题目)