imadjust

在matlab中imadjust原型如下:

g = imadjust(f,[low_in high_in], [low_out high_out], gamma)

f表示一张灰度图片,此函数将f的灰度值映象到g中的新值,也就是将low_in与high_in之间的值映射到low_out和high_out之间的值。
其中low_in以下与high_in以上的值可以被截去,也就是说小于low_in的值都被映射为low_out,大于high_in的值都被映射为high_out。
对于imadjust来说,处理图像f和gamma之外,其他所有参数值都限定为0到1之间。
对于gamma参数,下图可以进行说明,其中中间部分曲线就是由gamma函数生成的。

gamma函数很简单,其形式:

s=crγ

s=cr^{\gamma}
根据 γ\gamma值的不同,其函数曲线不同,下图是不同 γ\gamma值的情况

stretchlim

stretchlim在matlab原型如下:

Low_High = stretchlim(f, tol)

其中f是一张灰度图片,tol如果是一个两元素向量[low_frac high_frac],指定了图像低和高像素的饱和度百分比,tol如果是一个标量,那么low_frac = tol, high_frac = 1 - low_frac。tol默认值是[0.01 0.99]。简单的说,就是计算两个阈值,(默认情况)其中low代表小于这个值的像素占整张图片的1%,其中high代表大于这个值的像素占整张图片的1-0.99=1%。
通常利用stretchlim配合imadjust来自动地提高图片的对比度,而不关心参数高低的处理。
因为在利用c++实现stretchlim时用到了imhist,因此这里再说说imhist,matlab原型

h = imhist(f, b)

imhist用于处理图像直方图,其中f为输入图像,h为直方图h(rk)h(r_k),b是用来形成直方图的“统计堆栈”的数目,默认值是256。“统计堆栈”仅仅是灰度的一部分,例如我们在处理一个uint8类型的图像时,设置b=2,那么灰度范围就被分为两个部分:0~127和128~255。因此直方图就有两个值h(1)等于[0,127]间隔内的像素个数,h(2)等于[128,255]内的像素个数。

C++ Code

接来下给出上述函数的c++的实现方法,具体内容请参看这里,有关图片读写问题参看上一篇博文。

imhist

imhist.h

#pragma once
#include "UnsignedImage.h"
#include <vector>
namespace HW
{std::vector<int> imhist(const UnsignedImage& image, unsigned int n=256);
}

imhist.cpp

#include "imhist.h"
#include "HWImageProcess.h"
#include <iostream>
std::vector<int> HW::imhist(const UnsignedImage& image, unsigned int n /*= 256*/)
{std::vector<int> ans(n, 0);uint8_t maxGrayValue = 255;double a = 1.0*(n - 1) / maxGrayValue;int index = 0;LOOP_EACH_PIXEL_IMAGE(image){index = image.At(i, j, k) * a;++ans[index];}return ans;
}

stretchlim

stretchlim.h

#pragma once#include "UnsignedImage.h"
#include <vector>
namespace HW
{std::vector<double> strechlim(const UnsignedImage& image, double tol_low = 0.01, double tol_high = 0.99);
}

stretchlim.cpp

#include "stretchlim.h"
#include "imhist.h"
#include "HWImageProcess.h"
#include <numeric>std::vector<double> HW::strechlim(const UnsignedImage& image, double tol_low/*=0.01*/, double tol_high/*=0.99*/)
{double maxGrayValue = 255.0;auto hist = imhist(image);auto toltalSize = std::accumulate(hist.begin(), hist.end(), 0);std::vector<double> lowHigh(2);lowHigh[0] = 0;lowHigh[1] = 1;// find the first position which \sum_{i=0}^p >= tol_lowfor (int i = 0; i < hist.size(); ++i){auto sum = std::accumulate(hist.begin(), hist.begin() + i, 0.0);if (GE(sum / toltalSize, tol_low))  // > tol_low{lowHigh[0] = i / maxGrayValue;break;}}// find the first position which \sum_{i=0}^p >= tol_highfor (int i = 0; i < hist.size(); ++i){auto sum = std::accumulate(hist.rbegin(), hist.rbegin() + i, 0.0);if (GE(sum / toltalSize, 1 - tol_high)) // > tol_high{lowHigh[1] = 1.0 - i / maxGrayValue;break;}}return lowHigh;
}

imadjust

imadjust.h

#pragma once
#include "UnsignedImage.h"
#include <vector>
namespace HW
{/*s=cr^gc normal is 1*/  double gamma(double r, double g,double c=1.0);UnsignedImage imadjust(const UnsignedImage& f, double low_in, double high_in,double low_out, double high_out, double gammaScale=1.0);UnsignedImage imadjust(const UnsignedImage& f, const std::vector<double> low_high,double low_out, double high_out, double gammaScale = 1.0);
}

imadjust.cpp 从代码中可以看到,对像素值进行三种情况的不同处理。

#include "imadjust.h"
#include "HWImageProcess.h"
#include <cmath>
#include <assert.h>double HW::gamma(double r, double g, double c )
{return c*std::pow(r, g);
}
UnsignedImage HW::imadjust(const UnsignedImage& f, double low_in, double high_in,double low_out, double high_out, double gammaScale)
{assert(low_in < high_in);double maxGrayValue = 255.0;    // unsigned char is 255 onlydouble slope =  (high_out - low_out)/ (high_in - low_in);double p = 0.0;double result = 0.0;UnsignedImage g(f);LOOP_EACH_PIXEL(f.GetHeight(), f.GetWidth(), f.GetComponents()){p = f.At(i, j, k) / maxGrayValue;if (LT(p,low_in))   //[p,low_in, high_in]{result = low_out;}else if (GE(p,low_in) && LE(p,high_in)) //[low_in,p,high_in]{result = (p - low_in) * slope + low_out;result = gamma(result, gammaScale);}else if (GT(p,high_in)) //[low_in, high_in, p]{result = high_out;}g.At(i, j, k) = unsigned char(round(result * maxGrayValue));}return g;
}
UnsignedImage HW::imadjust(const UnsignedImage& f, const std::vector<double> low_high,double low_out, double high_out, double gammaScale /* = 1.0 */)
{assert(low_high.size() == 2);return HW::imadjust(f, low_high[0], low_high[1], low_out, high_out, gammaScale);
}

图像处理-灰度变换函数imadjust和stretchlim相关推荐

  1. matlab灰度变换函数imadjust、stretchlim

    1.imadjust函数 g=imadjust(f,[low_in,high_in],[low_out,high_out],gamma) f为输入灰度图像,将low_in和high_in之间的灰度值映 ...

  2. matlab怎么对图片实行伽马变换,matlab灰阶变换函数imadjust和stretchlim的c++实现

    灰阶变换 首先介绍一下灰阶变换,一幅图像数据本身在存储的数据结构上为一个二维的矩阵,即一幅图像为m*n个密密麻麻的像素点构成. image.png 然后,这些像素点有着一个值,这个值成为灰度值或者亮度 ...

  3. 数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)

    数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换.对数变换.伽马变换和分段线性变换) 空间域处理是直接对像素进行操作的方法,这是相对于频率域处理而言的.空间域处理主要分为两大类:灰度变换 ...

  4. 有必要总结一下:matlab图像灰度调整——imadjust函数的使用

    参考:https://blog.csdn.net/Ibelievesunshine/article/details/79958899 在MATLAB中,通过函数imadjust是一个计算机函数,该函数 ...

  5. 数字图像处理01:imadjust函数的Pyhton实现

    版权声明:本文为博主原创文章,未经博主允许不得转载. 数字图像处理01:imadjust函数的Pyhton实现 1.imadjust函数 Matlab的工具箱函数:imadjust(f,[low_in ...

  6. python实现对数转换_对数变换(一些基本的灰度变换函数)基本原理及Python实现...

    1. 基本原理 变换形式如下 $$T(r) = c\lg(r+1)$$ c为常数 由于对数函数的导数随自变量的增大而减小,对数变换将输入窄范围的低灰度值扩展为范围宽的灰度值和宽范围的高灰度值压缩为映射 ...

  7. matlab 灰度化原理公式,imadjust从用法到原理—Matlab灰度变换函数之一

    注:作者辛苦原创,转载请注明出处 imadjust函数是MATLAB的一个工具箱函数,一般的语法调用格式为: f1=imadjust(f,[low_in high_in],[low_out high_ ...

  8. matlab imadjust函数,imadjust从用法到原理—Matlab灰度变换函数之一

    imadjust函数是MATLAB的一个工具箱函数,一般的语法调用格式为: f1=imadjust(f,[low_in  high_in],[low_out  high_out],gamma) (注: ...

  9. 【数字图像处理】灰度变换函数(对数变换、反对数变换、幂次变换)

    // 对比度增强.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <opencv2/opencv.hpp> #i ...

最新文章

  1. Android之旅---Service
  2. 大数计算器概念c语言,用C语言求两个超大整数的和
  3. append有时加载不出来_为什么有时候画画很顺手,有时候怎么也画不出来?
  4. 如何在centos中找到安装mysql_如何在CentOS 7上安装MySQL
  5. Linux中断 - GIC代码分析
  6. 基于前后端分离的模版探索
  7. 如何在Word2010中设置不一样的稿纸
  8. 中国十大最具影响力黑客
  9. faceapp一直显示选择服务器,faceapp提示choosing a serve_faceapp提示choosing a serve解决办法_玩游戏网...
  10. rust货轮什么时候出现_庆余年海棠朵朵什么时候出现 庆余年海棠朵朵第几集出现...
  11. 【论文】如何记论文笔记
  12. Jeesite单点登录集成Cas另加自定义登录验证
  13. SPSS--回归-多元线性回归模型案例解析!(一)
  14. android10.0(Q) root QCOM-SM6125 user版本打开root权限
  15. 痞子衡嵌入式:内存读写正确性压力测试程序(memtester)
  16. 2020年第十一届蓝桥杯C/C++ B组第二场省赛真题
  17. github.io使用方法
  18. 快速传超大文件的解决方案
  19. DeepLAC论文笔记
  20. 天俊注塑机伺服每小时能省多少电?

热门文章

  1. 无序数组求第k大的数 python_【python刷题】寻找数组中第K大/小的数
  2. php中头部含义,PHP 常用的header头部定义汇总大全
  3. 宝石光是什么石头_天龙八部:尖晶石当初烂大街,现如今比红宝石还贵,售价150金...
  4. 23_python基础—模块和包
  5. 怎么用计算机弹是你,抖音带你去旅行怎么用计算器弹奏_抖音带你去旅行计算器乐谱_管理资源吧...
  6. php获取url传参数乱码问题,php url地址栏传中文值乱码问题与解决方法
  7. 编辑bpmn_「业务架构」BPMN简介第四部分-数据和工件
  8. 用python批量下载网络图片_python批量下载图片的三种方法
  9. php串行化场景,PHP中串行化的使用
  10. Mac下图像标注工具labelImg的安装