您的位置:首页 > 编程语言 > MATLAB

在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码!

2016-04-19 17:29 946 查看
分段线性变换的理论基础这里我就不多打字了,如有需要的可以通过链接查看我截的理论基础的图,不过要看懂下面的代码还真需要看一看,因为程序是根据这个理论基础写的!

链接为: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: