实验一:图像灰度变换 C++实现

一.实验目的

掌握 Opencv 进行图像处理的基础,实现图像的灰度变换处理。
1、掌握 OpenCV 的安装
2、掌握 OpenCV 对图像进行基本操作
3、掌握利用 OpenCV 对图像进行灰度变换

二.实验内容

1、利用 OpenCV 读取图像。
具体内容:用打开 OpenCV 打开图像,并在窗口中显示
2、灰度图像二值化处理
具体内容:设置并调整阈值对图像进行二值化处理。
3、灰度图像的对数变换
具体内容:设置并调整 r 值对图像进行对数变换。
4、灰度图像的伽马变换
具体内容:设置并调整γ值对图像进行伽马变换。
5、彩色图像的补色变换
具体内容:对彩色图像进行补色变换。

三.实验过程

1.利用 OpenCV 读取图像

#include "main.hpp"
#include 
using namespace cv;
int main(int argc, char** argv) {
    Mat image;
    //加载图片
    image = imread("/Users/Admin/Desktop/myProject/1.jpg", 1);
    //创建窗口
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    //显示图像
    imshow("Display Image", image);

    //暂停,等待按键结束
    waitKey(0);
    return 0;
}

实验代码和结果截图:
实验一:图像灰度变换 C++实现_第1张图片

2.灰度图像二值化处理

首先要先将图片处理为灰度图像:

//处理为灰度图像
void grayShow(Mat &image){
    Mat gray;
    cvtColor(image, gray, COLOR_RGBA2GRAY);
    namedWindow("gray picture");
    imshow("gray picture", gray);
    Threshold(gray);
    //logTransfer(gray);
    //gammaTranfer(gray);
}

之后开始进行二值处理:

//二值化变换
void Threshold(Mat &gray){
    Mat result;
    threshold(gray, result, 120,255,THRESH_BINARY);
    namedWindow("binary picture");
    imshow("binary picture", result);
}

实验结果:
实验一:图像灰度变换 C++实现_第2张图片

3.灰度图像的对数变换

对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强。
对灰度图像进行变换
代码实现:

//对数变换
void logTransfer(Mat &gray){
    Mat srcImage(gray);
    Mat dstImage(srcImage.size(),srcImage.type());
    //计算1+r
    add(gray, Scalar(1.0), srcImage);
    //转换为浮点数
    srcImage.convertTo(srcImage, CV_64F);
    //计算log(1+r) log:第一个参数为输入图像,第二个参数为得到的对数值
    log(srcImage,dstImage);
    //这里设c=1
    dstImage=1*dstImage;
    //归一化处理
    normalize(dstImage,dstImage,0,255,NORM_MINMAX);
    convertScaleAbs(dstImage, dstImage);
    imshow("dstpicture", dstImage);
}

实验一:图像灰度变换 C++实现_第3张图片
其中:

normalize()函数:

  • src 输入数组
  • dst 输出数组,支持原地运算
  • range normalization模式的最小值
  • range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
  • normType归一化的类型,可以有以下的取值:
    – NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
    –NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
    –NORM_L1 : 归一化数组的L1-范数(绝对值的和)
    –NORM_L2: 归一化数组的(欧几里德)L2-范数

4.灰度图像的伽马变换

它是对输入图像的灰度值进行指数变换,进而校正亮度上的偏差。其中c和 γ为正常数.,伽马变换的效果与对数变换有点类似,当 γ >1时将较窄范围的低灰度值映射为较宽范围的灰度值,同时将较宽范围的高灰度值映射为较窄范围的灰度值;当 γ <1时,情况相反,与反对数变换类似。
实验一:图像灰度变换 C++实现_第4张图片
代码实现:

 //伽马变换
    //gamma值,随着值不同图片呈现出不同的效果
void gammaTranfer(Mat &gray){
    //gamma值,随着值不同图片呈现出不同的效果
    double gamma=0.5;
    Mat grayImg;
    gray.convertTo(grayImg, CV_64F,1.0/255,0);
    Mat gammaImg;
    pow(grayImg, gamma,gammaImg);
    gammaImg.convertTo(gammaImg, CV_8U,255,0);
    imshow("gammapicture", gammaImg);
    
}

当gamma<1时,取gamma=0.5,对暗部份增强
实验一:图像灰度变换 C++实现_第5张图片
当gamma>1时,取gamma=2.5,对高亮部分增强
实验一:图像灰度变换 C++实现_第6张图片

5.彩色图像的补色处理

彩色环上,与色调直接相对的另一边称为补色。
实验一:图像灰度变换 C++实现_第7张图片
实现代码:
运用两种方法实现,一种是HSV
一种是RGB

//彩色图像变换
void colorTransfer(Mat &image){
    Mat colorpicture;
    image.copyTo(colorpicture);
   //HSV
    Mat hsvImg;
    cvtColor(image,hsvImg, COLOR_BGR2HSV);
    std::vector<Mat> hsv;
    split(hsvImg, hsv);
    hsv[0]=(Scalar::all(180)-hsv[0]);
    merge(hsv, colorpicture);
    imshow("补色HSV", colorpicture);
 //RGB
    colorpicture=Scalar::all(255)-image;
    imshow("RBGbuse", colorpicture);
 
}

实验结果:
实验一:图像灰度变换 C++实现_第8张图片

四.所有代码实现

#include "main.hpp"
#include 
using namespace cv;
//二值化变换
void Threshold(Mat &gray){
    Mat result;
    threshold(gray, result, 120,255,THRESH_BINARY);
    namedWindow("binary picture");
    imshow("binary picture", result);
}
//对数变换
void logTransfer(Mat &gray){
    Mat srcImage(gray);
    Mat dstImage(srcImage.size(),srcImage.type());
    //计算1+r
    add(gray, Scalar(8), srcImage);
    //转换为浮点数
    srcImage.convertTo(srcImage, CV_64F);
    //计算log(1+r) log:第一个参数为输入图像,第二个参数为得到的对数值
    log(srcImage,dstImage);
    dstImage=1*dstImage;
    //归一化处理
    normalize(dstImage,dstImage,0,255,NORM_MINMAX);
    convertScaleAbs(dstImage, dstImage);
    imshow("dstpicture", dstImage);
}

//伽马变换
void gammaTranfer(Mat &gray){
    //gamma值,随着值不同图片呈现出不同的效果
    double gamma=0.5;
    Mat grayImg;
    gray.convertTo(grayImg, CV_64F,1.0/255,0);
    Mat gammaImg;
    pow(grayImg, gamma,gammaImg);
    gammaImg.convertTo(gammaImg, CV_8U,255,0);
    imshow("gammapicture", gammaImg);
}
//彩色图像变换
void colorTransfer(Mat &image){
    Mat colorpicture;
    image.copyTo(colorpicture);
   //HSV
    Mat hsvImg;
    cvtColor(image,hsvImg, COLOR_BGR2HSV);
    std::vector<Mat> hsv;
    split(hsvImg, hsv);
    hsv[0]=(Scalar::all(180)-hsv[0]);
    merge(hsv, colorpicture);
    imshow("HSV_picture", colorpicture);
  //RGB
    colorpicture=Scalar::all(255)-image;
    imshow("RBG_picture", colorpicture);
}

//处理为灰度图像
void grayShow(Mat &image){
    Mat gray;
    cvtColor(image, gray, COLOR_RGBA2GRAY);
    namedWindow("gray picture");
    imshow("gray picture", gray);
    //Threshold(gray);
    //logTransfer(gray);
    gammaTranfer(gray);
}

int main(int argc, char** argv) {
    //读取图像
    Mat image;
    image = imread("/Users/Admin/Desktop/myProject/1.jpg", 1);
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", image);
    //grayShow(image);
    colorTransfer(image);
    waitKey(0);
    return 0;
}
    

你可能感兴趣的:(高级图像处理,opencv)