基于查找表的灰度拉伸
来源:互联网 发布:dijkstra算法 有向图 编辑:程序博客网 时间:2024/06/11 04:24
下面要写一个书上的例子,就是利用查找表来完成灰度图像的灰度拉伸。
在写程序中,我们总希望提升运算的速度,特别是在实时检测中,程序运算时间的长短决定着算法到底能不能用。查找表是把事先计算好的数据存入数组放在内存中,需要计算时只需要从内存中提取数据而不用每次都重复复杂的运算。简而言之,就是利用内存空间来换取运算的时间。
灰度拉伸又称为对比度拉伸,是把图像中某段灰度图像拉伸到另一段灰度下,从而改善图像的显示状况。
代码如下:
#include "stdafx.h"#ifndef HISTOGRAM_H_#define HISTOGRAM_H_#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>#include <opencv2/calib3d/calib3d.hpp>#include<iostream>#include <vector> using namespace std; using namespace cv; class Histogram1D { private: int histSize[1];//项的数目 float hranges[2];//像素的最大值以及最小值 const float *ranges[1]; int channels[1];//仅用到一个通道 public: Histogram1D(); cv::MatND getHistogram(const cv::Mat &image); cv::Mat getHistogramImage(const cv::Mat &image); cv::Mat applyLookUp(const cv::Mat &image,const cv::Mat &lookup); cv::Mat stretch(const cv::Mat &image,int minValue=0); };#endif /* HISTOGRAM_H_ *///#include "Histogram1D.h"Histogram1D::Histogram1D()//构造函数 直方图的参数 { histSize[0]=256; hranges[0]=0.0; hranges[1]=255.0; ranges[0]=hranges; channels[0]=0; };cv::MatND Histogram1D::getHistogram(const cv::Mat &image) { cv::MatND hist; // cv::calcHist(&image,1,channels,cv::Mat(),hist,1,histSize,ranges);//计算1D直方图 return hist; };//画出直方图cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image) { cv::MatND hist=getHistogram(image); double maxVal=0; double minVal=0; cv::minMaxLoc(hist,&minVal,&maxVal,0,0); cv::Mat histImg(histSize[0],histSize[0],CV_8U,cv::Scalar(255)); int hpt=static_cast<int>(0.9*histSize[0]); for(int h=0;h<histSize[0];h++) { float binVal=hist.at<float>(h); int intensity=static_cast<int>(binVal*hpt/maxVal); cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0)); } return histImg; };//应用查找表cv::Mat Histogram1D::applyLookUp(const cv::Mat &image,const cv::Mat &lookup){cv::Mat result;cv::LUT(image,lookup,result);//输入图像 一维数组 输出图像return result;}cv::Mat Histogram1D::stretch(const cv::Mat &image,int minValue){cv::MatND hist=getHistogram(image);int imin=0;for(;imin<histSize[0];imin++){std::cout<<hist.at<float>(imin)<<std::endl;if(hist.at<float>(imin)>minValue)break;}int imax=histSize[0]-1;for(;imax>=0;imax--){if(hist.at<float>(imax)>minValue)break;}int dim(256);cv::Mat lookup(1,&dim,CV_8U);for(int i=0;i<256;i++){if(i<imin)lookup.at<uchar>(i)=0;else if(i>imax)lookup.at<uchar>(i)=255;else lookup.at<uchar>(i)=static_cast<uchar>(255.0*(i-imin)/(imax-imin)+0.5);}cv::Mat result;result=applyLookUp(image,lookup);return result;}//#include"Histogram1D.h" int main() { cv::Mat image=cv::imread("d:\\lena.jpg",0);//读取的就是灰度图像 if( !image.data ) exit(0); if(image.channels()!=1) { cvtColor(image,image,CV_BGR2GRAY); } //namedWindow("image",0); //imshow("image",image); //waitKey(0); Histogram1D h; cv::Mat streteched=h.stretch(image,100);//直方图中像素个数小于100的给予忽略 cv::namedWindow("Histogram"); cv::imshow("Histogram",h.getHistogramImage(streteched)); cv::Mat thresholded; cv::threshold(streteched,thresholded,100,255,cv::THRESH_BINARY); cv::namedWindow("Binary Image"); cv::imshow("Binary Image",thresholded); cv::namedWindow("Streteched image"); cv::imshow("Streteched image",streteched); waitKey(0); return 0; }
输出结果:把灰度小于最小灰度(像素个数大于100)的置为0,高于最高灰度(像素个数大于100)的置为255,中间的像素为
255.0*(i-imin)/((imax-imin)+0.5)
0 0
- 基于查找表的灰度拉伸
- 基于灰度的分割
- 图像灰度拉伸
- 灰度图像拉伸方法
- 灰度图像的直方均衡、线性变换与线性拉伸
- java实现图像的直方图均衡以及灰度线性变化,灰度拉伸
- 基于c++的灰度线性变换
- [图像增强]四 灰度拉伸
- 图像增强—灰度拉伸
- 全等级直方图灰度拉伸
- 查找表,对比对拉伸,直方图均衡
- OpenCV之查找表与直方图拉伸
- 基于c++的图像的灰度修正
- 我的OpenCV学习笔记(13):计算直方图,利用查找表拉伸直方图,直方图均衡
- 【一种基于灰度差的模板匹配】
- 基于C++的灰度值方图处理
- 基于c++的灰度阈值变换
- opencv 基于灰度直方图的颜色迁移
- 第一篇 jdk1.7安装与java环境变量配置
- php如果一片空白,脚本没执行,可能是文件的编码问题,转化成UTF8就正常了
- TOP域名登陆全球平台
- CSS实现居中的7种方法
- SQL Server 索引列的顺序——真的没关系吗
- 基于查找表的灰度拉伸
- 为你的Android App实现自签名的 SSL 证书
- ios webservice编程:soap封装调用,返回xml,json解析
- android setting的学习笔记
- 四叉数之Box索引Point
- 如何注册有价值的TOP域名
- 一段时间以来,我在思索一个问题:如何让别人知道你的产品?
- sql server 创建分区表
- 简单总结Service-与Activity生命周期