#include<stdio.h>
#include"bmp.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#include <iostream>
#include<string>
using namespace std;#define PI 3.14159
#define LENGTH_NAME_BMP 30//文件名长度#define U 0//高斯分布的均值
#define D 0//高斯分布的均方差
FILE *fpi, *fpw;
BITMAPFILEHEADER strHead;
RGBQUAD strPla[256];
BITMAPINFOHEADER strInfo;int Roberts1[4] = { -1,0,0,1 };
int Roberts2[4] = { 0,-1,1,0 };
int Sobel1[9] = { -1,-2,-1,0,0,0,1,2,1 };
int Sobel2[9] = { -1,0,1,-2,0,2,-1,0,1 };
int Prewitt1[9] = { -1,-1,-1,0,0,0,1,1,1 };
int Prewitt2[9] = { -1,0,1,-1,0,1,-1,0,1 };
int Laplace1[9] = { 0,1,0,1,-4,1,0,1,0 };
int Laplace2[9] = { 1,1,1,1,-8,1,1,1,1 };//显示位图文件头信息
void showBmpHead(BITMAPFILEHEADER pBmpHead)
{cout << "位图文件头" << endl;cout << "文件大小" << pBmpHead.bfSize << endl;cout << "保留字_1" << pBmpHead.bfReserved1 << endl;cout << "保留字_2" << pBmpHead.bfReserved2 << endl;cout << "实际位图数据的偏移字节数:" << pBmpHead.bf0ffBits << endl;
}void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead)
{cout << "位图信息头" << endl;cout << "结构体的长度" << pBmpInforHead.biSize << endl;cout << "位图宽:" << pBmpInforHead.biWidth << endl;cout << "位图高:" << pBmpInforHead.biHeight << endl;cout << "biPlanes平面数:" << pBmpInforHead.biPlanes << endl;cout << "biBitCount采用颜色位数" << pBmpInforHead.biBitCount << endl;cout << "压缩方式" << pBmpInforHead.biCompression << endl;cout << "biSizeImage实际位图数据占用的字节数" << pBmpInforHead.biSizeImage << endl;cout << "X方向分辨率:" << pBmpInforHead.biXPelsPerMeter << endl;cout << "Y方向分辨率:" << pBmpInforHead.biYPelsPerMeter << endl;cout << "使用的颜色数:" << pBmpInforHead.biClrUsed << endl;cout << "重要颜色数:" << pBmpInforHead.biClrImportant << endl;
}int main()
{int Gaus_S();void conv2(IMAGEDATA *filter, int arr1[], int arr2[], int res[], int filterW, int filterH, int arrW, int arrH);void RobertsMethod(IMAGEDATA *filter, int filterW, int filterH);void Laplace(IMAGEDATA *filter, int filterW, int filterH);char strFile[LENGTH_NAME_BMP];//bmp文件名IMAGEDATA *imagedata = NULL;//动态分配存储原图片的像素信息的二维数组IMAGEDATA *imagedataRot = NULL;//动态分配处理后的图片像素信息int width, height;//图片的宽度和高度cout << "请输入所要读取的文件名(末尾要带有.bmp):" << endl;cin >> strFile;fopen_s(&fpi,strFile,"rb");//读取bmp图片信息、初始化数组if (fpi != NULL){WORD bfType;fread(&bfType, 1, sizeof(WORD), fpi);if (0x4d42 != bfType){cout << "the file is not a bmp file!" << endl;return NULL;}//读取bmp文件的文件头和信息头fread(&strHead, 1, sizeof(tagBITMAPFILEHEADER), fpi);showBmpHead(strHead);fread(&strInfo, 1, sizeof(tagBITMAPINFOHEADER), fpi);showBmpInforHead(strInfo);for (unsigned int nCounti = 0; nCounti < strInfo.biClrUsed; nCounti++){fread((char *)&strPla[nCounti].rgbBlue, 1, sizeof(BYTE), fpi);fread((char *)&strPla[nCounti].rgbGreen, 1, sizeof(BYTE), fpi);fread((char *)&strPla[nCounti].rgbRed, 1, sizeof(BYTE), fpi);cout << "strPla[nCounti].rgbBlue" << strPla[nCounti].rgbBlue << endl;cout << "strPla[nCounti].rgbGreen" << strPla[nCounti].rgbGreen << endl;cout << "strPla[nCounti].rgbRed" << strPla[nCounti].rgbRed << endl;}width = strInfo.biWidth;height = strInfo.biHeight;imagedata = (IMAGEDATA *)malloc(width*height*sizeof(IMAGEDATA));//初始化原始图片的像素数组for (int i = 0; i < height; ++i){for (int j = 0; j < width; ++j){(*(imagedata + i*width + j)).blue = 0;(*(imagedata + i*width + j)).green = 0;(*(imagedata + i*width + j)).red = 0;}}fread(imagedata, sizeof(struct tagIMAGEDATA)*width, height, fpi);fclose(fpi);//加入高斯噪声int x, y, p;srand((unsigned)time(NULL));for (y = 0; y < height; y++){for (x = 0; x < width; x++){(*(imagedata + y*width + x)).blue += Gaus_S();(*(imagedata + y*width + x)).green += Gaus_S();(*(imagedata + y*width + x)).red += Gaus_S();}}//Roberts算子int method;cout << "选择Roberts算子请输入1,Sobel算子请输入2,Prewitt算子请输入3,Laplace算子请输入4:" << endl;cin >> method;switch (method){case 1:RobertsMethod(imagedata, width, height);break;case 2:int res1[25];for (y = 1; y < height - 2; y++){for (x = 1; x < width - 2; x++){conv2(imagedata + y*width + x, Sobel1, Sobel2, res1, 3, 3, 3, 3);}}break;case 3:int res2[25];for (y = 1; y < height - 2; y++){for (x = 1; x < width - 2; x++){conv2(imagedata + y*width + x, Prewitt1, Prewitt2, res2, 3, 3, 3, 3);}}break;case 4:int res3[25];for (y = 1; y < height - 2; y++){for (x = 1; x < width - 2; x++){conv2(imagedata + y*width + x, Laplace1, Laplace2, res3, 3, 3, 3, 3);}}break;default:cout << "输入错误" << endl;}}else{cout << "file open error" << endl;system("pause");return NULL;}//保存bmp图片cout << "保存的文件名(必须在文件名后输入.bmp):" << endl;char s[LENGTH_NAME_BMP];cin >> s;if (fopen_s(&fpw, s, "wb") != NULL){cout << "create the bmp file error!" << endl;system("pause");return NULL;}WORD bfType_w = 0x4d42;fwrite(&bfType_w, 1, sizeof(WORD), fpw);fwrite(&strHead, 1, sizeof(tagBITMAPFILEHEADER), fpw);strInfo.biWidth =  width;strInfo.biHeight =  height;fwrite(&strInfo, 1, sizeof(tagBITMAPINFOHEADER), fpw);//保存调色板数据for (unsigned int nCounti = 0; nCounti < strInfo.biClrUsed; nCounti++){fwrite(&strPla[nCounti].rgbBlue, 1, sizeof(BYTE), fpw);fwrite(&strPla[nCounti].rgbGreen, 1, sizeof(BYTE), fpw);fwrite(&strPla[nCounti].rgbRed, 1, sizeof(BYTE), fpw);}//保存像素数据for (int i = 0; i < height; ++i){for (int j = 0; j <  width; j++){fwrite(&(*(imagedata + i * width + j)).red, 1, sizeof(BYTE), fpw);fwrite(&(*(imagedata + i * width + j)).green, 1, sizeof(BYTE), fpw);fwrite(&(*(imagedata + i * width + j)).blue, 1, sizeof(BYTE), fpw);}}fclose(fpw);//释放内存delete[] imagedata;system("pause");return 0;}//产生高斯样本,以U为均值,D为均方差
int Gaus_S() {double sum = 0;for (int i = 0; i < 12; i++)sum += rand() / 32767.00;return int(U + D*(sum - 6));
}//卷积计算
void conv2(IMAGEDATA *filter, int arr1[],int arr2[],int res[],int filterW,int filterH, int arrW, int arrH)
{int temp1;int temp2;int i = 0, j = 0;//bluefor (; i < filterH+arrH-1; i++){for (; j <filterW+ arrW-1; j++){temp1 = 0;temp2 = 0;for (int m = 0; m < filterH; m++){for (int n = 0; n < filterW; n++){if ((i - m) >= 0 && (i - m) < arrH && (j - n) >= 0 && (j - n) < arrW){temp1 += (*(filter+m*filterW+n)).blue*arr1[(i - m)*arrW+j-n];temp2 += (*(filter + m*filterW + n)).blue*arr2[(i - m)*arrW+j-n];}}}res[i*filterW+j]= (temp1^2+temp2^2)^(1/2);}}(*(filter)).blue = res[((i-1)/2)*filterW+(j-1)/2];//redfor (i=0; i < filterH + arrH - 1; i++){for (j=0; j <filterW + arrW - 1; j++){temp1 = 0;temp2 = 0;for (int m = 0; m < filterH; m++){for (int n = 0; n < filterW; n++){if ((i - m) >= 0 && (i - m) < arrH && (j - n) >= 0 && (j - n) < arrW){temp1 += (*(filter + m*filterW + n)).red*arr1[(i - m)*arrW + j - n];temp2 += (*(filter + m*filterW + n)).red*arr2[(i - m)*arrW + j - n];}}}res[i*filterW + j] = (temp1 ^ 2 + temp2 ^ 2)^(1/2);}}(*(filter)).red = res[((i - 1) / 2)*filterW + (j - 1) / 2];//greenfor (i = 0; i < filterH + arrH - 1; i++){for (j = 0; j <filterW + arrW - 1; j++){temp1 = 0;temp2 = 0;for (int m = 0; m < filterH; m++){for (int n = 0; n < filterW; n++){if ((i - m) >= 0 && (i - m) < arrH && (j - n) >= 0 && (j - n) < arrW){temp1 += (*(filter + m*filterW + n)).green*arr1[(i - m)*arrW + j - n];temp2 += (*(filter + m*filterW + n)).green*arr2[(i - m)*arrW + j - n];}}}res[i*filterW + j] = (temp1 ^ 2 + temp2 ^ 2)^(1/2);}}(*(filter)).green = res[((i - 1) / 2)*filterW + (j - 1) / 2];
}
//Roberts算子计算函数
void RobertsMethod(IMAGEDATA *filter,int filterW,int filterH)
{for (int m = 1; m < filterH-2; m++)for (int n = 1; n < filterW-2; n++){(*(filter + m*filterW + n)).blue = (((*(filter + m*filterW + n)).blue - (*(filter + (m + 1)*filterW + n + 1)).blue) ^ 2 + ((*(filter + m*filterW + n + 1)).blue - (*(filter + (m + 1)*filterW + n)).blue)) ^ (1 / 2);(*(filter + m*filterW + n)).green = (((*(filter + m*filterW + n)).green - (*(filter + (m + 1)*filterW + n + 1)).green) ^ 2 + ((*(filter + m*filterW + n + 1)).green - (*(filter + (m + 1)*filterW + n)).green)) ^ (1 / 2);(*(filter + m*filterW + n)).red = (((*(filter + m*filterW + n)).red - (*(filter + (m + 1)*filterW + n + 1)).red) ^ 2 + ((*(filter + m*filterW + n + 1)).red - (*(filter + (m + 1)*filterW + n)).red)) ^ (1 / 2);}
}

图像增强——Roberts算子、Sobel算子、Prewitt算子、Laplace算子相关推荐

  1. 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

    from:https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中 ...

  2. sobel、prewitt、Isotropic算子处理加噪图片

    #Isotropic算子 import cv2 import numpy as np from PIL import Image import math import matplotlib.pyplo ...

  3. 图像边缘检测——一阶微分算子 Roberts、Sobel、Prewitt、Kirsch、Robinson

    图像为什么会有边缘? 图像边缘一般指图像的灰度变化率最大的位置.成因主要如下: 1.图像灰度在表面方向变化不连续: 2.图像中物体在空间上的深度不一致: 3.在光滑的表面上颜色不一致: 4.图像中物体 ...

  4. 图像边缘检测——一阶微分算子 Roberts、Sobel、Prewitt、Kirsch、Robinson(Matlab实现)

    图像边缘一般指图像的灰度变化率最大的位置.成因主要如下: 1.图像灰度在表面法向变化不连续: 2.图像中物体在空间上的深度不一致: 3.在光滑的表面上颜色不一致: 4.图像中物体的光影 边缘检测指的是 ...

  5. OpenCV3学习(6.1)——边缘检测---Canny,Sobel,Prewitt,Robert,Laplace,LOG,DOG算子

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  6. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

  7. 图像处理中的梯度、导数如何求?(Robert算子,Sobel算子,Prewitt算子,Laplace算子)

    梯度的求法是多种多样的,根据不同的处理需要选择合适的算子(模版). 1.水平垂直差分法 2.Robert 梯度算子 3.Sobel算子               垂直方向               ...

  8. 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测

    canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...

  9. python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解

    实现思路: 1,将传进来的图片矩阵用算子进行卷积求和(卷积和取绝对值) 2,用新的矩阵(与原图一样大小)去接收每次的卷积和的值 3,卷积图片所有的像素点后,把新的矩阵数据类型转化为uint8 注意: ...

  10. GDAL 遥感 图像处理 锐化(Laplace算子、Sobel算子)

    GDAL 图像锐化 简介 拉普拉斯(Laplace)算子 部分代码: 索贝尔(Sobel)算子 部分代码: 处理效果 原图 (Laplace) (Sobel) 结尾 参考文章 简介 图像锐化(imag ...

最新文章

  1. 零基础自学Python:安装Python、解释器、代码风格等
  2. 什么是1+N模式的新一代城市大脑建设方案
  3. visual studio输入法打不了中文_目前比较满意的手机输入法方案:Gboard + 搜狗词库...
  4. Leetcode 137. Single Number II JAVA语言
  5. python数据校验_最近抽空造了一个数据校验的轮子 Python -validator
  6. 基础研究到底要基础到什么程度?
  7. ajax header的bearer token验证
  8. cshtml的a标签跳转页面_朋友圈标签来了!热门流量关键词带动视频号、小程序、搜一搜...
  9. SAP License:供应商寄售业务(合作伙伴不存在修改 443消息号)
  10. Promise源码实现
  11. Visual Studio 2011 Beta新特性(一):安装VS2011
  12. 51单片机c语言学习笔记,51单片机学习笔记(一)_总记
  13. java 自己实现连接池_JAVA自定义连接池原理设计(一)
  14. this product is covered by one or more of the following
  15. golang-querymoredeteleupdatedelete
  16. 如何在服务器上还原数据库文件,SQL Server 使用入门教程(bak文件还原数据库)...
  17. vfp中写入文本文件_Visual FoxPro基础知识
  18. STL库:map和set
  19. [$injector:unpr] Unknown provider:--angular.module()函数解答
  20. 聚类之K-Means++算法

热门文章

  1. k3 lede刷官改_斐讯K3路由LEDE固件刷回官方原版固件
  2. 【白皮书分享】2021年中国家庭教育白皮书.pdf(附下载链接)
  3. 天正提示加载lisp_天正加载不了 - 卡饭网
  4. Ubuntu校园iNode客户端超简单安装
  5. 全面系统学习机房精密空调设计、选型、安装、维保
  6. 软件测试 PreDay 决策表
  7. WS2811单线传输三通道LED驱动控制专用芯片
  8. 学习PLC到底要不要买PLC?
  9. 微信小程序列表切换样式简单案例
  10. 小米路由pro php,完全拆解小米路由器Pro:无接口,预加硬盘无望