德阳网站开发,用ps怎么做短视频网站,json网站开发,英文网站建设网站目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍
1.1 灰度反转
灰度反转是一种线性变换#xff0c;是将某个范围的灰度值映射到另一个范围内#xff0c;一般是通过灰度的对调#xff0c;突出想要查看的灰度区间。 S … 目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍
1.1 灰度反转
灰度反转是一种线性变换是将某个范围的灰度值映射到另一个范围内一般是通过灰度的对调突出想要查看的灰度区间。 S L − 1 − r ( r ⊂ [ 0 , L − 1 ] ) S L -1-r (r \subset [0,L-1]) SL−1−r(r⊂[0,L−1]) 比如在以下胸片图像中提取白色絮状形状在黑色背景下看的不太明显就可以使用灰度反转增强图像的可视化效果。
output_img input_img.clone();
for(int i 0; i input_img.rows; i)
{for(int j 0; j input_img.cols; j){output_img.atuchar(i, j) 255 - input_img.atuchar(i, j)}
}1.2 图像对数变换
对数变换可以将图像中低灰度值的部分进行提升显示出低灰度部分的特征对高灰度值部分进行抑制减少高灰度值部分的细节从而实现增项图像俺不细节优化图像的对比度。 S c log ( 1 r ) Sc\log(1r) Sclog(1r) 其原理就是对数曲线在像素值低的区域斜率大在像素值高的地方斜率小。 对数变换后图像的灰度值可能会超出0~255的区间所以在对数变换后要进行归一化处理将图像灰度值调节回0-255的区间。 Mat LogarithmImg grayImg.clone();for(int i0;igrayImg.rows;i){for(int j0;jgrayImg.cols;j){LogarithmImg.atuchar(i,j) 6*log((double)grayImg.atuchar(i,j) 1);}}normalize(LogarithmImg, LogarithmImg, 0, 255,NORM_MINMAX);convertScaleAbs(LogarithmImg,LogarithmImg);1.3 图像伽马变换
图像的伽马变换其实就是通过非线性变换将图像中较暗区域的灰度值进行增强对较亮区域的灰度值进行抑制从而获得图像比较好的细节特征。 s c r γ ( r ∈ [ 0 , 1 ] ) scr^\gamma (r\in[0, 1]) scrγ(r∈[0,1]) r为灰度的输入值c为灰度缩放系数伽马因子控制整个变换的缩放程度。 Mat gammaImg grayImg.clone();for(int i0;igrayImg.rows;i){for(int j0;jgrayImg.cols;j){gammaImg.atuchar(i,j) 6*pow((double)grayImg.atuchar(i,j), 0.5);}}normalize(gammaImg, gammaImg, 0, 255,NORM_MINMAX);convertScaleAbs(gammaImg,gammaImg);2、效果图
使用lena图进行灰度反转、对数变换、伽马变化测试在Qt上实现加载和变换。
3、代码实现 widget.h #ifndef WIDGET_H
#define WIDGET_H#include QWidget
#include opencv2/opencv.hpp
#include QResizeEventQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEusing namespace cv;
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:void on_btn_loadPic_clicked();void on_btn_InversionTrans_clicked();void on_btn_logarithmTrans_clicked();void on_btn_gammaTrans_clicked();void on_btn_resetPic_clicked();private:Ui::Widget *ui;// 灰度图像Mat grayImg;// Mat图像类型转换为QImageQImage cvMat2QImage(const cv::Mat mat);
};
#endif // WIDGET_Hwidget.cpp #pragma execution_character_set(utf-8)
#include widget.h
#include ui_widget.h
#include QDebugWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);this-setWindowTitle(OpenCV图像变换);
}Widget::~Widget()
{delete ui;
}void Widget::on_btn_loadPic_clicked()
{Mat Img imread(lena.png);cvtColor(Img, grayImg, COLOR_BGR2GRAY);QImage qImg_Gray cvMat2QImage(grayImg);ui-lbl_grayPic-setPixmap(QPixmap::fromImage(qImg_Gray.scaled(ui-lbl_grayPic-size())));
}void Widget::on_btn_InversionTrans_clicked()
{Mat InversionImg grayImg.clone();for(int i0;igrayImg.rows;i){for(int j0;jgrayImg.cols;j){InversionImg.atuchar(i,j) 255 - grayImg.atuchar(i,j);}}QImage qImg_Inversion cvMat2QImage(InversionImg);ui-lbl_InversionPic-setPixmap(QPixmap::fromImage(qImg_Inversion.scaled(ui-lbl_InversionPic-size())));
}void Widget::on_btn_logarithmTrans_clicked()
{Mat LogarithmImg grayImg.clone();for(int i0;igrayImg.rows;i){for(int j0;jgrayImg.cols;j){LogarithmImg.atuchar(i,j) 6*log((double)grayImg.atuchar(i,j) 1);}}normalize(LogarithmImg, LogarithmImg, 0, 255,NORM_MINMAX);convertScaleAbs(LogarithmImg,LogarithmImg);QImage qImg_Logarithm cvMat2QImage(LogarithmImg);ui-lbl_LogPic-setPixmap(QPixmap::fromImage(qImg_Logarithm.scaled(ui-lbl_LogPic-size())));
}void Widget::on_btn_gammaTrans_clicked()
{Mat gammaImg grayImg.clone();for(int i0;igrayImg.rows;i){for(int j0;jgrayImg.cols;j){gammaImg.atuchar(i,j) 6*pow((double)grayImg.atuchar(i,j), 0.5);}}normalize(gammaImg, gammaImg, 0, 255,NORM_MINMAX);convertScaleAbs(gammaImg,gammaImg);QImage qImg_Gamma cvMat2QImage(gammaImg);ui-lbl_GammaPic-setPixmap(QPixmap::fromImage(qImg_Gamma.scaled(ui-lbl_GammaPic-size())));
}void Widget::on_btn_resetPic_clicked()
{ui-lbl_grayPic-clear();ui-lbl_InversionPic-clear();ui-lbl_LogPic-clear();ui-lbl_GammaPic-clear();
}QImage Widget::cvMat2QImage(const cv::Mat mat)
{switch ( mat.type() ){// 8-bit 4 channelcase CV_8UC4:{QImage image( (const uchar*)mat.data, mat.cols, mat.rows, static_castint(mat.step), QImage::Format_RGB32 );return image;}// 8-bit 3 channelcase CV_8UC3:{QImage image( (const uchar*)mat.data, mat.cols, mat.rows, static_castint(mat.step), QImage::Format_RGB888 );return image.rgbSwapped();}// 8-bit 1 channelcase CV_8UC1:{static QVectorQRgb sColorTable;// only create our color table onceif ( sColorTable.isEmpty() ){sColorTable.resize( 256 );for ( int i 0; i 256; i ){sColorTable[i] qRgb( i, i, i );}}QImage image( (const uchar*)mat.data, mat.cols, mat.rows, static_castint(mat.step), QImage::Format_Indexed8 );image.setColorTable( sColorTable );return image;}default:qDebug(Image format is not supported: depth%d and %d channels\n, mat.depth(), mat.channels());qWarning() cvMatToQImage - cv::Mat image type not handled in switch: mat.type();break;}return QImage();
}4、源码展示
本小例程的代码放到我的开源gitte项目里欢迎一起学习交流也希望能收获你的小星星。 项目源码GrayTrans