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

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

本文中的代码根据以下原理写成:

首先给MATLAB的源码吧!

clear all;
close all;
clc;
I=imread('coins.png');
B=MySegmentLinear(I,0.3,0.7,0.13,0.85);

其中MySegmentLinear是自己写的MATLAB函数,代码如下:

function out = MySegmentLinear(I,x1,x2,y1,y2)
%作者微信/QQ 2487872782
%有问题可以联系作者交流

I=im2double(I);
[M,N] = size(I);
out = zeros(M,N);

for i=1:M
    for j=1:N
        if I(i,j)<x1
            out(i,j) = y1 * I(i,j) / x1;
        elseif I(i,j)>x2
            out(i,j) = (I(i,j)-x2)*(1-y2)/(1-x2) + y2;
        else
            out(i,j) = (I(i,j)-x1)*(y2-y1)/(x2-x1) + y1;
        end
    end
end

out=255.*out;
out=uint8(out);

end

接下来是OpenCV1.x环境下写的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;
}

下面的截图是运行结果,可以看出两个程序的运行结果是一样的:

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值