美文网首页
灰度变换

灰度变换

作者: _酒酿芋圆 | 来源:发表于2019-01-18 10:44 被阅读0次

一、 反相

1.1 公式:灰度级范围为[0, L-1]的一幅图像的反相图像, s=L-1-r

1.2 代码

#include <iostream>
#include "pch.h"
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

/* Inverse 反相 */
void inverse(Mat& img) {
    for (int i = 0; i < img.rows; i++) {
        for (int j = 0; j < img.cols; j++) {
            img.at<Vec3b>(i, j)[0] = 255 - img.at<Vec3b>(i, j)[0];
            img.at<Vec3b>(i, j)[1] = 255 - img.at<Vec3b>(i, j)[1];
            img.at<Vec3b>(i, j)[2] = 255 - img.at<Vec3b>(i, j)[2];
        }
    }
}

int main()
{
    Mat img = imread("x.jpg");

    // 原图
    imshow("Original", img);

    // 反相处理
    inverse(img);
    imshow("Inversed", img);

    waitKey();
    return 0;
}

1.3 效果

image1 image2

二、对数变换

2.1 公式:s=clog(r+1)

2.2 代码

#include <iostream>
#include "pch.h"
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

/* Logarithmic transformation 对数变换 */
Mat logTransform_Gray(Mat& img,double c) {
    Mat dst(img.rows, img.cols, CV_8UC1, Scalar(0));
    double pixels[256] = { 0 };

    if (img.type() == CV_8UC3) 
        cvtColor(img, img, CV_BGR2GRAY);
    img.copyTo(dst);

    for (int i = 0; i < 256; i++) 
        pixels[i] = log(i + 1);
    
    for (int i = 0; i < dst.rows; i++) 
        for (int j = 0; j < dst.cols; j++) 
            dst.at<uchar>(i, j) = pixels[dst.at<uchar>(i, j)];
        
    normalize(dst, dst, 0, 255, CV_MINMAX);
    return dst;
}

Mat logTransform_RGB(Mat& img, double c) {
    Mat temp, dst;
    img.copyTo(temp);
    if (temp.type() == CV_8UC1) 
        cvtColor(temp, temp, CV_GRAY2BGR);
    
    Mat matArray[3];
    split(temp, matArray);

    for (int i = 0; i < 3; i++) 
        matArray[i] = logTransform_Gray(matArray[i], c);
    
    merge(matArray, 3, dst);
    return dst;
}

int main() {
    Mat src, dst;

    src = imread("./TestImages/Fig0305(a)(DFT_no_log).tif");

    if (!src.data)
        return -1;

    dst = logTransform_RGB(src,1);

    imshow("Raw", src);
    imshow("LogTransform", dst);

    waitKey();
    return 0;
}

2.3 效果

三、伽马变换

3.1 公式:s=cr^γ

3.2 代码

#include <iostream>
#include "pch.h"
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
/* Gamma Correction */
Mat gammaCorrection_Gray(Mat& img, double c, double gamma) {
    Mat dst(img.rows, img.cols, CV_8UC1, Scalar(0));
    double pixels[256] = { 0 };
    if (img.type() == CV_8UC3)
        cvtColor(img, img, CV_BGR2GRAY);
    img.copyTo(dst);

    for (int i = 0; i < 256; i++) {
        pixels[i] = c * pow(((double)i / (double)255.0), gamma) * 255;
        if (pixels[i] > 255) 
            pixels[i] = 255;
        else if (pixels[i] < 0) 
            pixels[i] = 0;
    }

    for (int i = 0; i < dst.rows; i++) 
        for (int j = 0; j < dst.cols; j++) 
            dst.at<uchar>(i, j) = pixels[dst.at<uchar>(i, j)];
        
    normalize(dst, dst, 0, 255, CV_MINMAX);
    return dst;
}

Mat gammaCorrection_RGB(Mat& img, double c, double gamma) {
    Mat temp, dst;
    img.copyTo(temp);
    if (temp.type() == CV_8UC1)
        cvtColor(temp, temp, CV_GRAY2BGR);

    Mat matArray[3];
    split(temp, matArray);

    for (int i = 0; i < 3; i++) 
        matArray[i] = gammaCorrection_Gray(matArray[i],  c, gamma);
    
    merge(matArray, 3, dst);
    return dst;
}
int main()
{
    Mat src,  dst, t, a;
    src = imread("./TestImages/Fig0308(a)(fractured_spine).tif");

    if (!src.data)
        return -1;

    dst = gammaCorrection_RGB(src, 1, 0.6);
    t = gammaCorrection_RGB(src, 1, 0.4);
    a = gammaCorrection_RGB(src, 1, 0.3);

    imshow("Raw", src);
    imshow("c=1, gamma=0.6", dst);
    imshow("c=1, gamma=0.4", t);
    imshow("c=1, gamma=0.3", a);
    waitKey();
    return 0;
}

3.3 效果


Sample1 Sample2

相关文章

  • 图像灰度变换

    1.灰度变换指对图像的单个像素进行操作,主要以对比度和阈值处理为目的。其变换形式如下。 其中,T 是灰度变换函数;...

  • 【图像处理】灰度变换

    简介 空间域处理主要分为灰度变换和空间滤波两类: 灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的,我...

  • 灰度变换

    灰度变换是针对与空间域中的图像,直接对每一个像素点进行操作,灰度变换一般是用一个函数来将原图像转化成另一个图像,以...

  • 灰度变换

    一、 反相 1.1 公式:灰度级范围为[0, L-1]的一幅图像的反相图像, s=L-1-r 1.2 代码 1.3...

  • exp1-空间域图像增强

    图像灰度变换 计算显示图像直方图、直方图均衡化 空间域图像平滑、锐化

  • 2、灰度变换函数

    1、imadjust 和 stretchlim imadjust 用于对灰度级图像进行灰度变换。 除了 f 和 ...

  • 直方图

    画出图像直方图 直方图归一化 这种归一化直方图的操作被称作灰度变换(Grayscale Transformatio...

  • 图像增强整理

    功能与算法对应表 参考文档 灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割 《数字图像处理》(...

  • ImageJ 中文教程(细胞计数)

    File->open,或者快捷键ctrl+o,打开所要编辑的图片Image->Type->8-bit,灰度变换Ed...

  • 三、图像直方图变换和几何变换

    直方图变换 灰度变换 点运算 几何变换 直方图变换 1.灰度直方图 灰度直方图:数字图像中每一灰度级像素出现的频次...

网友评论

      本文标题:灰度变换

      本文链接:https://www.haomeiwen.com/subject/ldggdqtx.html