在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码!
2016-04-19 17:29
946 查看
分段线性变换的理论基础这里我就不多打字了,如有需要的可以通过链接查看我截的理论基础的图,不过要看懂下面的代码还真需要看一看,因为程序是根据这个理论基础写的!
链接为:http://pan.baidu.com/s/1dFoFuSD
首先给MATLAB的源码吧!
其中MySegmentLinear是自己写的函数,函数M文件下载链接:http://pan.baidu.com/s/1boAhUu7
再给OpenCV环境下写的C代码吧!程序中用到的图像下载链接http://pan.baidu.com/s/1slilbPF
下面的截图证明运行结果是正确的:
-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号248787278
链接为:http://pan.baidu.com/s/1dFoFuSD
首先给MATLAB的源码吧!
clear all; close all; clc; I=imread('coins.png'); B=MySegmentLinear(I,0.3,0.7,0.13,0.85);
其中MySegmentLinear是自己写的函数,函数M文件下载链接:http://pan.baidu.com/s/1boAhUu7
再给OpenCV环境下写的C代码吧!程序中用到的图像下载链接http://pan.baidu.com/s/1slilbPF
#include <opencv2/opencv.hpp> #include <opencv2/legacy/compat.hpp> #include <fstream> using namespace std; #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") void MySegmentLinear(IplImage *src, IplImage *dst,double x1,double x2,double y1,double y2) { IplImage *pOutImage_64F = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F,1); cvConvertScale(src,pOutImage_64F); int M,N; M=src->height; N=src->width; int i,j; double CurrentPixelValue; for(i=0;i<M;i++) for(j=0;j<N;j++) { CurrentPixelValue=cvGet2D(pOutImage_64F,i,j).val[0]; CvScalar DstPixelValue; if(CurrentPixelValue<x1) { DstPixelValue.val[0] = y1 * CurrentPixelValue / x1; cvSet2D(pOutImage_64F,i,j,DstPixelValue);//set the (i,j) pixel value } else if(CurrentPixelValue>x2) { DstPixelValue.val[0] = (CurrentPixelValue-x2)*(255-y2)/(255-x2) + y2; cvSet2D(pOutImage_64F,i,j,DstPixelValue);//set the (i,j) pixel value } else { DstPixelValue.val[0] = (CurrentPixelValue-x1)*(y2-y1)/(x2-x1) + y1; cvSet2D(pOutImage_64F,i,j,DstPixelValue);//set the (i,j) pixel value } } cvConvertScale(pOutImage_64F,dst); } int main() { // 从文件中加载原图 IplImage *pSrcImage = cvLoadImage("coins.png", CV_LOAD_IMAGE_UNCHANGED); //创建输出的图像 IplImage *pOutImage_8U = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1); MySegmentLinear(pSrcImage,pOutImage_8U,0.3*255,0.7*255,0.13*255,0.85*255); //输出中间值,与MATLAB的结果对比,看是否正确,仅为调试时用 unsigned char watch_pOutImage_8U[100]; int i; for(i=0;i<100;i++) { watch_pOutImage_8U[i]=cvGet2D(pOutImage_8U,47,i+200).val[0]; } return 0; }
下面的截图证明运行结果是正确的:
-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号248787278
相关文章推荐
- 语音信号的端点检测的matlab代码(子带谱熵法法)
- Matlab之fopen、fprintf函数
- MATLAB--数据处理
- Matlab之size函数
- matlab求解常微分方程组/传染病模型并绘制SIR曲线
- Matlab标定工具箱使用的一些注意事项
- 把Matlab的Logo用Matlab画出来
- Python调用MatLab引擎
- matlab 曲线线型、颜色和标记点 和 legend
- Matlab中的线型、标记和颜色
- C/C++调用Matlab程序
- C++调用Matlab Compiler Runtime库函数的最简方法
- MATLAB区域标记提取指定编号区域
- Matlab曲面拟合和插值
- Matlab数字图像处理之图像运算
- Matlab 图像处理相关函数命令大全
- Matlab的regionprops详解
- 使用axes函数在matlab绘图中实现图中图的绘制
- matlab中结构体和python中字典的异同
- Matlab Creo CAD软件精度探讨1.1