图像线性变换的原理及基于OpenCV的C++实现
2023-09-11 14:15:39 时间
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
图像的线性变换是图像处理的基本运算,通常应用在调整图像的画面质量方面,如图像对比度、亮度及反转等操作。对于输入图像f(x,y),输出图像g(x,y),其线性变换表达式为:
其中参数a表示图像对比度变化,b表示图像亮度变化。
当a<0时,图像变换代表反转操作,如a=-1、b=255,这是常见的8位灰度图像的反转操作设置参数;
当|a|>1时,图像变换代表对比度增加操作;
当|a|<1时,图像变换代表对比度减少操作。
当b>0时,表示图像变换操作是亮度增加操作;
b<0时,表示图像变换操作是亮度减少操作。
线性变换的OpenCV源代码如下图所示:
源码中用到的图像的下载链接:
https://pan.baidu.com/s/1i4Dvm2h
//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
// 图像线性变换操作
cv::Mat linearTransform(cv::Mat srcImage, float a, int b)
{
if(srcImage.empty()){
std::cout<< "No data!" <<std::endl;
}
const int nRows = srcImage.rows;
const int nCols = srcImage.cols;
cv::Mat resultImage =
cv::Mat::zeros(srcImage.size(), srcImage.type());
// 图像元素遍历
for( int i = 0; i < nRows; i++ )
{
for( int j = 0; j < nCols; j++ )
{
for( int c = 0; c < 3; c++ )//如果源图像是灰度图,那么把这里改为c<1即可
{
// 矩阵at操作,检查下标防止越界
resultImage.at<Vec3b>(i,j)[c] =
saturate_cast<uchar>(a *
(srcImage.at<Vec3b>(i,j)[c]) + b);
}
}
}
return resultImage;
}
int main()
{
// 图像获取及验证
cv::Mat srcImage = cv::imread("lakeWater.jpg");
if(!srcImage.data)
return -1;
cv::imshow("srcImage", srcImage);
//cv::waitKey(0);
// 线性变换
float a = 1.2;
int b = 50;
cv::Mat new_image = linearTransform(srcImage, a, b);
cv::imshow("dst", new_image);
cv::waitKey(0);
return 0;
}
运行结果如下图所示:
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
相关文章
- qt实现web服务器加载vue应用进行C++和html混合编程-连载【6】-企业级系统开发实战连载系列 -技术栈(vue、element-ui、qt、c++、sqlite)
- [c++菜鸟]《Accelerate C++》习题解答
- 使用OpenCV 的GUI中的鼠标盒滑动条
- 用C++_OpenCV生成一幅灰度值为0~255的测试图像(测试矩阵)
- Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例
- 利用OpenCV的函数max()和min()取两幅图像中相同位置像素点的较大值或较小值
- VS2008在调试OpenCV_2.3.1的程序时报错丢失tbb_debug.dll的解决办法
- OpenCV环境下对图像进行灰度拉伸变换的C++源码【设置低阈值和高阈值、通过映射表实现】
- 实现图像旋转的MATLAB源码和OpenCV下的C/C++源码
- OpenCV下实现单窗口显示多幅图像(C++源码)
- 利用OpenCV的函数threshold()实现双阈值二值化操作的C++代码
- C++的Opencv动态库遇到的问题
- c#调用c++(Opencv)dll的实例
- C#调用C++(opencv)中图片数据传递的问题
- C++ OpenCV 图像转换,识别图像轮廓,画矩形
- OpenCV Mat类详解和用法
- Opencv教程(Python)
- python安装opencv
- OpenCV特征点检測------Surf(特征点篇)
- Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo
- OpenCV:图像的颜色空间转换
- 实战深度学习(上)OpenCV库
- opencv学习笔记