每天进步一点点------如何实现Sobel Edge Detector? (Image Processing) (C/C++)
使用C與C++/CLI實現Sobel Edge Detector。
http://www.cnblogs.com/oomusou/archive/2008/07/23/sobel_edge_detector.html
- /*
- (C) OOMusou 2007 http://oomusou.cnblogs.com
- Filename : sobel_edge.c
- Compiler : Visual C++ 8.0
- Description : Demo the how to use sobel detector on gray level image
- Release : 07/23/2008 1.0
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define MASK_N 2
- #define MASK_X 3
- #define MASK_Y 3
- #define WHITE 255
- #define BLACK 0
- unsigned char *image_s = NULL; // source image array
- unsigned char *image_t = NULL; // target image array
- FILE *fp_s = NULL; // source file handler
- FILE *fp_t = NULL; // target file handler
- unsigned int width, height; // image width, image height
- unsigned int rgb_raw_data_offset;// RGB raw data offset
- unsigned char bit_per_pixel; // bit per pixel
- unsigned short byte_per_pixel; // byte per pixel
- // bitmap header
- unsigned char header[] = {
- 0x42, // identity : B
- 0x4d, // identity : M
- , , , , // file size
- , , // reserved1
- , , // reserved2
- , , , , // RGB data offset
- , , , , // struct BITMAPINFOHEADER size
- , , , , // bmp width
- , , , , // bmp height
- , , // planes
- , , // bit per pixel
- , , , , // compression
- , , , , // data size
- , , , , // h resolution
- , , , , // v resolution
- , , , , // used colors
- , , , // important colors
- };
- // sobel mask
- int mask[MASK_N][MASK_X][MASK_Y] = {
- {{-,-,-},
- { , , },
- { , , }},
- {{-, , },
- {-, , },
- {-, , }}
- };
- int read_bmp(const char *fname_s) {
- fp_s = fopen(fname_s, "rb");
- if (fp_s == NULL) {
- printf("fopen fp_s error\n");
- return -;
- }
- // move offset to 10 to find rgb raw data offset
- fseek(fp_s, , SEEK_SET);
- fread(&rgb_raw_data_offset, sizeof(unsigned int), , fp_s);
- // move offset to 18 to get width & height;
- fseek(fp_s, , SEEK_SET);
- fread(&width, sizeof(unsigned int), , fp_s);
- fread(&height, sizeof(unsigned int), , fp_s);
- // get bit per pixel
- fseek(fp_s, , SEEK_SET);
- fread(&bit_per_pixel, sizeof(unsigned short), , fp_s);
- byte_per_pixel = bit_per_pixel / ;
- // move offset to rgb_raw_data_offset to get RGB raw data
- fseek(fp_s, rgb_raw_data_offset, SEEK_SET);
- image_s = (unsigned char *)malloc((size_t)width * height * byte_per_pixel);
- if (image_s == NULL) {
- printf("malloc images_s error\n");
- return -;
- }
- image_t = (unsigned char *)malloc((size_t)width * height * byte_per_pixel);
- if (image_t == NULL) {
- printf("malloc image_t error\n");
- return -;
- }
- fread(image_s, sizeof(unsigned char), (size_t)(long)width * height * byte_per_pixel, fp_s);
- return ;
- }
- // convert RGB to gray level int
- int color_to_int(int r, int g, int b) {
- return (r + g + b) / ;
- }
- int sobel(double threshold) {
- unsigned int x, y, i, v, u; // for loop counter
- unsigned char R, G, B; // color of R, G, B
- double val[MASK_N] = {0.0};
- int adjustX, adjustY, xBound, yBound;
- double total;
- for(y = ; y != height; ++y) {
- for(x = ; x != width; ++x) {
- for(i = ; i != MASK_N; ++i) {
- adjustX = (MASK_X % ) ? : ;
- adjustY = (MASK_Y % ) ? : ;
- xBound = MASK_X / ;
- yBound = MASK_Y / ;
- val[i] = 0.0;
- for(v = -yBound; v != yBound + adjustY; ++v) {
- for (u = -xBound; u != xBound + adjustX; ++u) {
- if (x + u >= && x + u < width && y + v >= && y + v < height) {
- R = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + );
- G = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + );
- B = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + );
- val[i] += color_to_int(R, G, B) * mask[i][u + xBound][v + yBound];
- }
- }
- }
- }
- total = 0.0;
- for (i = ; i != MASK_N; ++i) {
- total += val[i] * val[i];
- }
- total = sqrt(total);
- if (total - threshold >= ) {
- // black
- *(image_t + byte_per_pixel * (width * y + x) + ) = BLACK;
- *(image_t + byte_per_pixel * (width * y + x) + ) = BLACK;
- *(image_t + byte_per_pixel * (width * y + x) + ) = BLACK;
- }
- else {
- // white
- *(image_t + byte_per_pixel * (width * y + x) + ) = WHITE;
- *(image_t + byte_per_pixel * (width * y + x) + ) = WHITE;
- *(image_t + byte_per_pixel * (width * y + x) + ) = WHITE;
- }
- }
- }
- return ;
- }
- int write_bmp(const char *fname_t) {
- unsigned int file_size; // file size
- fp_t = fopen(fname_t, "wb");
- if (fp_t == NULL) {
- printf("fopen fname_t error\n");
- return -;
- }
- // file size
- file_size = width * height * byte_per_pixel + rgb_raw_data_offset;
- header[] = (unsigned char)(file_size & 0x000000ff);
- header[] = (file_size >> ) & 0x000000ff;
- header[] = (file_size >> ) & 0x000000ff;
- header[] = (file_size >> ) & 0x000000ff;
- // width
- header[] = width & 0x000000ff;
- header[] = (width >> ) & 0x000000ff;
- header[] = (width >> ) & 0x000000ff;
- header[] = (width >> ) & 0x000000ff;
- // height
- header[] = height &0x000000ff;
- header[] = (height >> ) & 0x000000ff;
- header[] = (height >> ) & 0x000000ff;
- header[] = (height >> ) & 0x000000ff;
- // bit per pixel
- header[] = bit_per_pixel;
- // write header
- fwrite(header, sizeof(unsigned char), rgb_raw_data_offset, fp_t);
- // write image
- fwrite(image_t, sizeof(unsigned char), (size_t)(long)width * height * byte_per_pixel, fp_t);
- fclose(fp_s);
- fclose(fp_t);
- return ;
- }
- int main() {
- read_bmp("lena.bmp"); // 24 bit gray level image
- sobel(90.0);
- write_bmp("lena_sobel.bmp");
- }
- /*
- (C) OOMusou 2007 http://oomusou.cnblogs.com
- Filename : sobel_edge.cpp
- Compiler : C++/CLI / Visual C++ 8.0
- Description : Demo the how to use sobel detector on gray level image
- Release : 07/23/2008 1.0
- */
- #include "stdafx.h"
- #include <cmath>
- using namespace System::Drawing;
- using namespace System::Drawing::Imaging;
- const int MASK_N = ;
- const int MASK_X = ;
- const int MASK_Y = ;
- // Convert RGB to gray level int
- int colorToInt(Color %color) {
- return (color.R + color.G + color.B) / ;
- }
- void edgeDetector(Bitmap^ oriImg, Bitmap^ resImg, const int mask[MASK_N][MASK_X][MASK_Y], const double &threshold) {
- double val[MASK_N] = {0.0};
- for(int y = ; y != oriImg->Height; ++y) {
- for(int x = ; x != oriImg->Width; ++x) {
- for(int i = ; i != MASK_N; ++i) {
- int adjustX = (MASK_X % ) ? : ;
- int adjustY = (MASK_Y % ) ? : ;
- int xBound = MASK_X / ;
- int yBound = MASK_Y / ;
- val[i] = 0.0;
- for(int v = -yBound; v != yBound + adjustY; ++v) {
- for (int u = -xBound; u != xBound + adjustX; ++u) {
- if (x + u >= && x + u < oriImg->Width && y + v >= && y + v < oriImg->Height) {
- val[i] += colorToInt(oriImg->GetPixel(x + u, y + v)) * mask[i][u + xBound][v + yBound];
- }
- }
- }
- }
- double total = 0.0;
- for (int i = ; i != MASK_N; ++i) {
- total += val[i] * val[i];
- }
- total = sqrt(total);
- if (total - threshold >= )
- resImg->SetPixel(x , y, Color::Black);
- else
- resImg->SetPixel(x, y, Color::White);
- }
- }
- }
- int main() {
- const int mask[MASK_N][MASK_X][MASK_Y] = {
- {{-,-,-},
- { , , },
- { , , }},
- {{-, , },
- {-, , },
- {-, , }}
- };
- Bitmap^ oriImg = gcnew Bitmap("lena.bmp");
- Bitmap^ resImg = gcnew Bitmap(oriImg->Width, oriImg->Height);
- const double threshold = 90.0;
- edgeDetector(oriImg, resImg, mask, threshold);
- resImg->Save("lena_sobel.bmp");
- return ;
- }
每天进步一点点------如何实现Sobel Edge Detector? (Image Processing) (C/C++)的更多相关文章
- Canny Edge Detector
Canny边缘检测算法有自己的理论和经验性的推导, 没仔细看/没看明白. 它的步骤如下: 对原图的灰度图进行高斯滤波 求一阶导数, 得到每个像素点的梯度强度和方向. 非最大抑制. 对每个edge ca ...
- Understanding Convolution in Deep Learning
Understanding Convolution in Deep Learning Convolution is probably the most important concept in dee ...
- 32个最热CPLD-FPGA论坛
1. OPENCORES.ORG这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到.进入后,选择project或者由http//www.opencores.org/browse.cgi ...
- [转]FPGA网站推荐
1. OPENCORES.ORG这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到.进入后,选择project或者由http//www.opencores.org/browse.cgi ...
- Computer Vision_33_SIFT:Remote Sensing Image Registration With Modified SIFT and Enhanced Feature Matching——2017
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...
- Sobel Derivatives
https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html ...
- 线特征---Edge Drawing(七)
http://ceng.anadolu.edu.tr/cv/edgedrawing/ References C. Topal, C. Akinlar, Edge Drawing: A Combined ...
- 2.7 Sobel导数
OpenCV函数 Sobel(src_gray,grad_x/grad_y,ddepth,x_order,y_order,scale,delta,BORDER_DEFAULT ) Scharr( ) ...
随机推荐
- C++——指针2-指向数组的指针和指针数组
7.4 指向数组元素的指针 声明与赋值 例:int a[10], *pa; pa=&a[0]; 或 pa=a[p1] ; 通过指针引用数组元素,经过上述声明及赋值后: *pa就是a[0],*( ...
- python特性
# for用法 for i in range(0,100,2): print(i) n = 0 # while用法 while n < 100: print(n) n += 2 else: pr ...
- mybatis-plus - buildSqlSessionFactory()
一. buildSqlSessionFactory() mybatis-plus 同样的是调用 factory.getObject() 方法来进行 SqlSessionFactory 创建的. 然后 ...
- 保存数据到文件的模块(json,pickle,shelve,configparser,xml)_python
一.各模块的主要功能区别 json模块:将数据对象从内存中完成序列化存储,但是不能对函数和类进行序列化,写入的格式是明文. (与其他大多语言交互的类型) pickle模块:将数据对象从内存中完成序列 ...
- nginx下载,安装,基础命令,和代理tomcat例子理解
nginx代理讲的很好理解:https://www.cnblogs.com/ysocean/p/9392908.html 一.nginx应用场景: 1.反向代理(用的非常多) 客户端发出请求,反向代理 ...
- 【HTML】三种方法使HTML单页面输入密码才能访问
方法一 <script type="text/javascript"> function password() { var testV = 1; var pass1 = ...
- MyEclipse 安装 emmet 插件
1.在线安装 地址:http://download.emmet.io/eclipse/updates/ 安装完成后重新启动myeclipse 2.离线安装 下载jar包:https://github. ...
- IntelliJ IDEA快捷键设置
IntelliJ IDEA是java编程语言开发的集成环境,目前有很多用户喜欢使用IDEA进行相关开发,IDEA使用起来十分方便,本篇博客主要是介绍IDEA快捷键(Keymap)的设置和使用. I ...
- c# 泛型<T>类型参数T的约束where
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上 ...
- js设计模式之实现观察者模式实例代码
前端界面 html代码 <body> <select name="" id="select"> <option value=&qu ...