基础知识:

线性灰度变换函数f(x)是一个一维线性函数
y=f(x)=ax+b
式中;a为线性函数的斜率,b为线性函数在y轴的截距,x表示输入图像的灰度值,y表示输出图像的灰度值。
(1) 当a>1时,输出图像的对比度将增加;当a<1时,输出图像的对比度将减小。
       (2) 当a=1时,且b不等于0时,操作仅仅使得所有的像素灰度值上移或者下移,其效果使得整个输出图像更亮或者更暗
(3) 当a<1时,暗区域将变亮,亮区域将变暗,这种线性改变亮度可能由于像素亮度达到饱和(小于0或者大于255)而丢失一部分细节。
        (4)特殊情况下,当a=1,b=0时,输入图像和输出图像一致;
                                      当a=-1,b=255,输出图像的灰度正好反转。灰度反转处理适用于增强暗色图像中的亮度较大的细节部分,这也是由人的视觉特性决定的。
/*----------------------------------------------------------------------------------------------
* 程序说明:基于OpenCV实现图像线性变化
*开发环境:
*        win7+vs2010+opencv2.4.8
*创建时间地点:
*        陕西师范大学.2017.2.28
*参考资料:
*        《数字图像处理与计算机视觉》张铮,徐超-----那本蓝色书66页的算法
*作    者:
*        李先生
-----------------------------------------------------------------------------------------------*/
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\imgproc\imgproc_c.h>
//using namespace std;
using namespace cv;/*----------------------------------线性变换函数的声明----------------------------------------
*函数原型
*       bool LinTran(IplImage *srcImage, double a,double b);
*参数
*       double a:线性变换的斜率
*       double b:线性变换的截距
*返回值类型
*       bool类型;true为成功,false为失败
--------------------------------------------------------------------------------------------*/
bool LinTran(IplImage *srcImage, double a,double b);//---------------------------------【Main 函数】------------------------------------------------
//                                 我们的程序从这里开始执行
//------------------------------------------------------------------------------------------------
int main()
{IplImage* srcImage=cvLoadImage("G:\\Image\\lena.png");   //加载一副图片double a=-1,b=255;                                      //注意:这里的参数a,b可以根据具体需要进行设置CvSize graySize;graySize.height=srcImage->height;graySize.width=srcImage->width;IplImage* grayImage=cvCreateImage(graySize,srcImage->depth,1);cvCvtColor(srcImage,grayImage,CV_RGB2GRAY);              //当数据类型一致时,它将图像从一个颜色空间(通道的数值)转换到另一个LinTran(grayImage,a,b);                                  //调用线性变换函数cvNamedWindow("原图");cvNamedWindow("变换结果");cvShowImage("原图",srcImage);cvShowImage("变换结果",grayImage);waitKey(0);return 0;
}bool LinTran(IplImage *grayImage, double a,double b)       //线性变换函数的实现
{if((grayImage->depth)!=8) return false;uchar gray;       //存储当前光标像素的灰度值int target;     //存储当前光标像素的目标值for(int h=0;h<grayImage->height;h++)                    //开始遍历grayImage灰度图像{for(int w=0;w<grayImage->width;w++){gray=(uchar)*((char*)(grayImage->imageData+h*grayImage->widthStep)+grayImage->nChannels*w); //取出当前坐标点的灰度值target=a*gray+b;if(target<0)  target=0;if(target>255)  target=255;*(char*)(grayImage->imageData+h*grayImage->widthStep+grayImage->nChannels*w) = target;      //将目标值写入目标图像}}return true;
}

效果图片

基于OpenCV实现图像线性变化相关推荐

  1. 基于OpenCV平滑图像

    基于OpenCV平滑图像也就是图像模糊,本博文介绍使用OpenCV的不同函数通过线性滤波进行图像平滑. cv::blur cv::GaussianBlur (高斯模糊) cv::medianBlur ...

  2. 4.3【图像镜像】-------------基于Opencv实现-----图像的镜像变换

     [1]理论知识:         镜像变换又分为水平镜像和垂直镜像,水平镜像即将图像左半部分和右半部分以图像竖直中轴线为中心轴进行兑换,而竖直镜像则是将图像上半部分和下半部分以图像水平中轴线为中 ...

  3. 基于Opencv的图像卡通化

    基于Opencv的图像卡通化 基于Opencv的图像卡通化 铅笔素描效果 国画效果 抽象效果 基于Opencv的图像卡通化 主要工具是高斯滤波器.细节增强滤波器.双边滤波.拉普拉斯滤波器. 铅笔素描效 ...

  4. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  5. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  6. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  7. 基于OpenCV实现------图像的转置

    [1]理论基础 图像转置是将图像的x坐标和y坐标互换,图像的大小会随之改变----------即高度和宽度将互换. [2]图像转置的变换公式 因为转置矩阵的逆矩阵仍然是其本身,故转置变换的逆变换具有相 ...

  8. 基于OpenCV实现图像平移

    [1]理论知识 图像平移就是将图像中所有的点按照指定的平移量水平或者垂直移动 [2]完整代码 /*--------------------------------------------------- ...

  9. java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

最新文章

  1. GPT3后可考虑的方向-知识推理与决策任务及多模态的信息处理
  2. JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别
  3. 英特尔新CEO的「第一把火」:火速返聘退休3年的“酷睿i7之父”
  4. html与java接口,JavaWeb学习——Servlet相关的接口和类
  5. 系统辨识理论及应用_企业战略分析的理论工具
  6. 基于语音识别技术的声控鼠标光标程序设计
  7. Java基础篇:简单数据类型
  8. Centos硬盘IO性能检测命令iostat[转]
  9. 重建即单体,重建大师5.0发布 模方3.0单体化功能永久免费
  10. 机器学习之---马尔可夫随机场的应用
  11. 带你Dart带你Diao之类
  12. 2022山东省安全员A证操作证考试题库模拟考试平台操作
  13. 股票实战分析专题-金融量化初级练习使用
  14. Android中文件的读写---assets和raw下的资源文件
  15. SpringBoot整合微信扫码登录
  16. 亲测,idea切换分支异常:error: The following untracked working tree files would be overwritten by checkout
  17. 以管理员身份在当前目录打开命令行窗口
  18. 公司里的技术总监CTO,天天都在干些啥?
  19. 【人工智能 AI 】当前世界人工智能领域发展最前沿的技术
  20. DaVinci:跟踪器 - 窗口

热门文章

  1. php get教程,PHP $_GET 变量
  2. laravel encryptstring加密使用方法_磁盘加密怎么取消 重装系统后加密磁盘无法使用的解决方法...
  3. jsp给前端注入值失败_基于 qiankun 的微前端最佳实践(图文并茂) 应用间通信篇...
  4. HP-UX Oracle Ioctl ASYNC_CONFIG error=1
  5. android状态栏背景色和图标颜色更改总结
  6. 将Eclipse Android项目打包成APK文件
  7. python unittest excel,Python unittest excel数据驱动
  8. mysql排插问题_手把手教你分析 MySQL 死锁问题
  9. PHP中使用CURL实现Get和Post请求方法
  10. [USB].USB总线详解