图像的线性变换的原理及OpenCV代码实现~

以你之姓@ 2022-08-23 09:00 256阅读 0赞

图像的线性变换是图像处理的基本运算,通常应用在调整图像的画面质量方面,如图像对比度、亮度及反转等操作。对于输入图像f(x,y),输出图像g(x,y),其线性变换表达式为:

20160613135628011

其中参数a表示图像对比度变化,b表示图像亮度变化。当a<0时,图像变换代表反转操作,如a=-1、b=255,这是常见的8位灰度图像的反转操作设置参数;当|a|>1时,图像变换代表对比度增加操作;当|a|<1时,图像变换代表对比度减少操作。当b>0时,表示图像变换操作是亮度增加操作;b<0时,表示图像变换操作是亮度减少操作。

线性变换的OpenCV源代码如下图所示:

源码中用到的图像的下载链接为:http://pan.baidu.com/s/1i4Dvm2h

图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号”qxsf321”,并关注!

  1. //OpenCV版本2.4.9
  2. //图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
  3. #include <opencv2/core/core.hpp>
  4. #include <opencv2/highgui/highgui.hpp>
  5. #include <opencv2/imgproc/imgproc.hpp>
  6. #include <iostream>
  7. using namespace cv;
  8. // 图像线性变换操作
  9. cv::Mat linearTransform(cv::Mat srcImage, float a, int b)
  10. {
  11. if(srcImage.empty()){
  12. std::cout<< "No data!" <<std::endl;
  13. }
  14. const int nRows = srcImage.rows;
  15. const int nCols = srcImage.cols;
  16. cv::Mat resultImage =
  17. cv::Mat::zeros(srcImage.size(), srcImage.type());
  18. // 图像元素遍历
  19. for( int i = 0; i < nRows; i++ )
  20. {
  21. for( int j = 0; j < nCols; j++ )
  22. {
  23. for( int c = 0; c < 3; c++ )//如果源图像是灰度图,那么把这里改为c<1即可
  24. {
  25. // 矩阵at操作,检查下标防止越界
  26. resultImage.at<Vec3b>(i,j)[c] =
  27. saturate_cast<uchar>(a *
  28. (srcImage.at<Vec3b>(i,j)[c]) + b);
  29. }
  30. }
  31. }
  32. return resultImage;
  33. }
  34. int main()
  35. {
  36. // 图像获取及验证
  37. cv::Mat srcImage = cv::imread("lakeWater.jpg");
  38. if(!srcImage.data)
  39. return -1;
  40. cv::imshow("srcImage", srcImage);
  41. //cv::waitKey(0);
  42. // 线性变换
  43. float a = 1.2;
  44. int b = 50;
  45. cv::Mat new_image = linearTransform(srcImage, a, b);
  46. cv::imshow("dst", new_image);
  47. cv::waitKey(0);
  48. return 0;
  49. }

运行结果如下图所示:

20160613140441211

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读