怎样用c语言对bmp图像进行线性拉伸

怎样用c语言对bmp图像进行线性拉伸,第1张

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <iostream>

 

using namespace std

using namespace cv

 

 

Mat XianChange(Mat &img, double alt, int base)//灰度线性变化、

{

CV_Assert(img.depth() != sizeof(uchar))  //声明只对深度8bit的图像 *** 作  

Mat temp = img.clone()

 

int channels = img.channels()            //获取图像channel  

int nrows = img.rows                     //矩阵的行数  

int ncols = img.cols*channels             //矩阵的总列数=列数*channel分量数  

if (img.isContinuous())               //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组  

{

ncols *= nrows

nrows = 1                 //一维数组  

}

//遍历像素点灰度值  行烂

for (int i = 0 i<nrows i++)

{

uchar *p = temp.ptr<uchar>(i)    //获取行地址  

for (int j = 0 j<ncols j++)

{

p[j] = alt*p[j] + base//修改灰度值  

 

if (p[j] > 255)

p[j] = 255

if (p[j] < 0)

p[j] = 0

}

}

return temp

}

 

Mat XianStretch(Mat &枣郑img, int a, int b, int c, int d)//线性灰度拉伸,将[a,b]拉伸到[c,d]

{

CV_Assert(img.depth() != sizeof(uchar))  //声明只对深度8bit的图像 *** 作  

Mat temp = img.clone()

 

int channels = img.channels()            //获取图像channel  

int nrows = img.rows                     //矩阵的行数  

int ncols = img.cols*channels             //矩阵的总列数=列数*channel分量数  

if (img.isContinuous())               //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组  

{

ncols *= nrows

nrows = 1                 //一维数组  

}

//遍历像素点灰度值  

for (int i = 0 i<nrows i++)

{

uchar *p = temp.ptr<uchar>(i)    //获取行地址  

for (int j = 0 j<ncols j++)

{

if (p[j] < a)

p[j] = c / b * p[j]

else if (p[j] > a && p[j] < b)

p[j] = (d - c) / (b - a) * (p[j] - a) + c

else

p[j] = (255 - d) / (255 - b) *(p[j] - b) + d

}

}

return temp

}

 

Mat HistogramEqu(Mat &img)               //直方均档岩漏衡

{

CV_Assert(img.depth() != sizeof(uchar))  //声明只对深度8bit的图像 *** 作  

Mat temp = img.clone()

int grayNum[260] = { 0 }

int grayMap[260] = { 0 }

 

int channels = img.channels()            //获取图像channel  

int nrows = img.rows                     //矩阵的行数  

int ncols = img.cols*channels             //矩阵的总列数=列数*channel分量数  

int allPixel = nrows*ncols               //图像的像素总数

int c                                    //用于计算累积分布概率

 

if (img.isContinuous())               //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组  

{

ncols *= nrows

nrows = 1    //一维数组  

}

//遍历像素点灰度值  

for (int i = 0 i<nrows i++)

{

uchar *p = temp.ptr<uchar>(i)    //获取行地址  

for (int j = 0 j<ncols j++)

{

grayNum[p[j]]++        //原图像的直方图

}

}

 

for (int i = 0 i < 256 i++)     //重新定义新的直方图

{

c = 0

for (int j = 0 j<=i j++)

{

c += grayNum[j]

grayMap[i] = int (255 * c / allPixel)

}

//printf("%d %d\n", i, grayMap[i])

}

 

 

 

for (int i = 0 i < nrows i++)     //重新定义新的直方图

{

uchar *p = temp.ptr<uchar>(i)    //获取行地址  

for (int j = 0 j < ncols j++)

{

p[j] = grayMap[p[j]]

}

}

return temp

}

 

int main()

{

string picName = "lena256.jpg"

Mat A = imread(picName, CV_LOAD_IMAGE_GRAYSCALE)    //读入灰度图像  

imshow("变换前", A)

 

Mat B = XianChange(A, 1, 20)//根据需要设置不同的参数

imshow("线性变换后", B)

 

Mat C = XianStretch(A, 10, 100, 20, 50)//根据需要设置不同的参数

imshow("线性拉伸后", C)

 

Mat D = HistogramEqu(A)

imshow("直方均衡后", D)

 

waitKey()

return 0

}

你读入的是灰度图像jpg,但你却对它进行了灰度转戚派换A=rgb2gray(A);如颂物果读入彩色图像你的程序就可以运行出来。

A=imread('C:\Users\Administrator\Desktop\11.bmp')% 线性灰度线性变换(拉伸)程序

a=20,b=250,c=50,d=200

A=rgb2gray(A)

figureimshow(A)

X=A

[p,q]=size(X) % 获取输入图像的行列数

Y=zeros(p,q)

for i=1:p

  for j=1:q

      if X(i,j)<a

   高樱贺       Y(i,j)=c

      else

          if X(i,j)<b

          Y(i,j)=((d-c)/(b-a))*(X(i,j)-a)+c

      else

          Y(i,j)=d

          end

      end

  end

end

Y=uint8(Y)

figureimshow(Y)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12281474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存