Demo entry 6645382

该程序可打开各种格式的图片并将其转换成灰度图像, 获取图像深度并对其进行图像求反和动态范围压缩, 将生成的图像显示在屏幕上,也保存到了工程文件夹中。

   

Submitted by anonymous on Oct 10, 2017 at 09:02
Language: C#. Code size: 2.9 kB.

//
//  main.cpp
//  灰度映射
//
//  Created by 高莉 on 2017/9/21.
//  该程序可打开各种格式的图片并将其转换成灰度图像,
//  获取图像深度并对其进行图像求反和动态范围压缩,
//  将生成的图像显示在屏幕上,也保存到了工程文件夹中。
//
//  生成的图片的相对路径为 .\build\Debug
//
//  Copyright © 2017年 高莉. All rights reserved.
//


#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cmath>

using namespace std;
using namespace cv;

Mat reverse(Mat src,int depth)//图像求反
{
    Mat result = src.clone();//完全拷贝,把src_img中的所有信息拷贝到result中
    
    int L = pow(2.0,depth);//计算图像的灰度范围
    
    uchar *pDataMat;
    
    for (int j = 0; j < result.rows; j++)//遍历像素
    {
        pDataMat = result.ptr<uchar>(j);//得到第j行的首地址
        for (int i = 0; i < result.cols; i++)//处理每一行像素
        {
            pDataMat[i] = L - 1 - (int)pDataMat[i];//t=(L-1)-s
            
            //限定像素范围
            if(pDataMat[i] > (L - 1))
                pDataMat[i] = L - 1;
            else if(pDataMat[i] < 0)
                pDataMat[i] = 0;
        }
    }
    return result;
}

Mat compress(Mat src,int depth)//动态范围压缩
{
    Mat result = src.clone();//完全拷贝,把src_img中的所有信息拷贝到result中
    
    int L = pow(2.0,depth);
    
    uchar *pDataMat;
    
    for (int j = 0; j < result.rows; j++)
    {
        pDataMat = result.ptr<uchar>(j);//得到第j行的首地址
        for (int i = 0; i < result.cols; i++)//处理每一行像素
        {
            
            pDataMat[i] = 25 * log(1 + (double)pDataMat[i]);
            
            if(pDataMat[i] > L - 1)
                pDataMat[i] = L - 1;
            else if(pDataMat[i] < 0)
                pDataMat[i] = 0;
        }
    }
    return result;
}


int main(int argc, char* argv[])
{
    //读取图像
    Mat src_img = imread("groot.jpg");
    Mat rev_img,cmprs_img,src_gray;
    
    if(src_img.empty())
    {
        printf("Can not load the image!\n");
        return 0;
    }
    
    //转为灰度图像
    cvtColor(src_img, src_gray, CV_BGR2GRAY);

    int depth = 0;
    int num = src_gray.depth();//获取图像深度
    //对应关系为{CV_8U = 0,CV_8S = 1,CV_16U = 2,CV_16S = 3,CV_32S = 4,CV_32F = 5,CV_64F = 6}
    
    switch (num) {
        case 0:
        case 1:
            depth = 8;
            break;
        case 2:
        case 3:
            depth = 16;
            break;
        case 4:
        case 5:
            depth = 32;
            break;
        case 6:
            depth = 64;
            break;
    }
    
    rev_img = reverse(src_gray,depth);
    cmprs_img = compress(src_gray,depth);
    
    //显示图像
    imshow("original image", src_gray);
    imshow("reversed image", rev_img);
    imshow("compressed image",cmprs_img);
    
    //生成图像
    imwrite("sourece_gray_image.jpg", src_gray);
    imwrite("reversed.jpg", rev_img);
    imwrite("compressed.jpg", cmprs_img);
    
    //等待用户按键
    waitKey();
    
    return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).