c++ - 图像处理 : luminance weighted 2

标签 c++ opencv

我想权衡新图像的亮度值。 我有一张 5 像素的图像 (5px.jpg),亮度为:50,100,150,200,250。

我有一个系数 vector 。

我创建了一个新的 Mat Z,它结合了 5px.jpg 的亮度和系数。

因此,我的第一个亮度值是 50 (lum[0]=50),我希望它应用于矩阵的第一个像素 5.1 (coef[0]=5.1)。为此,我需要用第一个和第二个亮度值对第 6 个像素进行加权。在我的例子中,我的第 6 个像素的亮度将为 95,因为 (0.1*50)+(0.9*100)=95

等等……

但我不知道为什么我的代码不起作用。

我已经针对 vector here 问过类似的问题现在,我正在尝试适应图像。

我输入的图片:

enter image description here

我的输出:

enter image description here

#define MPI 3.14159265358979323846264338327950288419716939937510
#define RAD2DEG (180./MPI)
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>
#include <math.h>
#include <string.h>
using namespace cv;
using namespace std;

int main()
{

    Mat image = imread("5px.jpg", 1);
    if (image.empty())
    {
        cout << "Couldn't load " << image << endl;

    }
    else
    {
        cout << "Image upload, go" << endl;
    }


    namedWindow("ImageIn", CV_WINDOW_AUTOSIZE);
    imshow("ImageIn", image);
    Mat imgGrayScale;

    cvtColor(image, imgGrayScale, CV_BGR2GRAY);


    float *deltaP = new float[imgGrayScale.cols];
    float *angle = new float[imgGrayScale.cols];
    float *coeff = new float[imgGrayScale.cols];
    int col;


    for (col = 0; col < imgGrayScale.cols; ++col)
    {
        //cout << "position x = " << col << endl;
        deltaP[col] = imgGrayScale.at<uchar>(0, col);
        //cout << "luminance = " << deltaP[col] << endl;

        angle[col] = acos(deltaP[col] / 255);
        //cout << "angle =" << angle[col] << endl;

        coeff[col] = (1 / cos(angle[col]));
        cout << "coeff = " << coeff[col] << endl;
    }

    int width = imgGrayScale.size().width;
    int height = imgGrayScale.size().height;

    int width2 = width * 5;

    int idx_coef = 0;
    Mat Z = Mat::zeros(height, width2, CV_8UC1);


    //for (int r = 0; r < imgGrayScale.rows; r++)
    //{
    //cout << "Saut de ligne "  << endl << endl << endl;
    for (int t = 0; t < imgGrayScale.cols; t++)
    {
        //cout << "Saut de colonne "  << endl;
        // Attribue le coeff à une variable
        int c = int(coeff[idx_coef]);
        //cout << "x" << t << endl;

        for (int i = 0; i < c; ++i)
        {
            Z.at<uchar>(0, c) = imgGrayScale.at<uchar>(0, t);
        }


        float alpha = fmod(coeff[idx_coef], 1.f);
        float beta = 1.f - alpha;

        Z.at<uchar>(0, c + 1) = (alpha * imgGrayScale.at<uchar>(0, t) + beta *  imgGrayScale.at<uchar>(0, t + 1));

        idx_coef++;
        coeff[idx_coef] = coeff[idx_coef] - beta;



        if (idx_coef >= width - 1)
        {

            int cc = int(coeff[idx_coef]);
            for (int i = 0; i < cc; ++i)
            {
                Z.at<uchar>(0, c) = imgGrayScale.at<uchar>(0, t);
            }
            idx_coef = 0;
            break;

        }

    }
    //}

    namedWindow("m", CV_WINDOW_AUTOSIZE);
    imshow("m", Z);
    imwrite("lumianacetest.jpg", Z);
    int t = waitKey();
    if ((char)t == 27)

        return 0;
}

最佳答案

  • 您在访问矩阵 Z 时弄乱了索引。您不应在 c 列访问 Z,但您需要访问 current 列(作为 vector::push_back会做)。所以你可以将当前索引列保存在一个变量中,这里是idx_z,每次访问Z
  • 时都会递增它
  • 这里你的 ZCV_8U,所以你失去了准确性,因为你的值是 float。您可以将Z创建为CV_32F,如果您需要以CV_8U格式存储值以保存图像,您可以转换为 CV_8U 后来,最终。
  • Z 的最后一列不会被设置为任何值(因此我将它们初始化为值 0)。如果您需要它们具有 imgGrayScale 中的最后一个值,只需对代码的相关部分进行反注释即可。

这里是代码:

#define MPI 3.14159265358979323846264338327950288419716939937510
#define RAD2DEG (180./MPI)

#include <opencv2\opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;

int main()
{
    Mat1b imgGrayScale = (Mat1b(2, 5) <<    50, 100, 150, 200, 250,
                                            50, 100, 150, 200, 250);

    vector<float> deltaP(imgGrayScale.cols);
    vector<float> angle(imgGrayScale.cols);
    vector<float> coeff(imgGrayScale.cols);
    int col;


    for (col = 0; col < imgGrayScale.cols; ++col)
    {
        //cout << "position x = " << col << endl;
        deltaP[col] = imgGrayScale.at<uchar>(0, col);
        //cout << "luminance = " << deltaP[col] << endl;

        angle[col] = acos(deltaP[col] / 255);
        //cout << "angle =" << angle[col] << endl;

        coeff[col] = (1 / cos(angle[col]));
        cout << "coeff = " << coeff[col] << endl;
    }

    int width = imgGrayScale.size().width;
    int height = imgGrayScale.size().height;

    int width2 = width * 5;


    Mat1f Z(height, width2, 0.f);


    for (int r = 0; r < imgGrayScale.rows; r++)
    {
        int idx_lum = 0;
        int idx_coef = 0;
        int idx_z = 0;

        vector<float> coef = coeff;

        // Set all values in Z to the last value in imgGrayScale
        Z.row(r) = imgGrayScale(r, imgGrayScale.cols-1);

        while (true)
        {
            int c = int(coef[idx_coef]);

            for (int i = 0; i < c; ++i)
            {
                Z(r, idx_z++) = imgGrayScale(r, idx_lum);
            }


            float alpha = fmod(coef[idx_coef], 1.f);
            float beta = 1.f - alpha;

            Z(r, idx_z++) = (alpha * imgGrayScale(r, idx_lum) + beta *  imgGrayScale(r, idx_lum + 1));

            idx_coef++;
            idx_lum++;
            coef[idx_coef] = coef[idx_coef] - beta;

            if (idx_lum >= imgGrayScale.cols - 1 || idx_coef >= coef.size() - 1)
            {

                int cc = int(coef[idx_coef]);
                for (int i = 0; i < cc; ++i)
                {
                    Z(r, idx_z++) = imgGrayScale(r, idx_lum);
                }
                idx_coef = 0;
                break;

            }

        }
    }

    Mat1b ZZ;
    Z.convertTo(ZZ, CV_8U);

    cout << "Float values:" << endl;
    cout << Z << endl << endl;

    cout << "Uchar values:" << endl;
    cout << ZZ << endl << endl;

    namedWindow("m", CV_WINDOW_AUTOSIZE);
    imshow("m", Z);
    imwrite("lumianacetest.png", ZZ);
    waitKey();

    return 0;
}

关于c++ - 图像处理 : luminance weighted 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305206/

相关文章:

opencv - 在 OpenCV 中打包像素数据

qt - Windows上带有OpenCv 2.3.4的Qt Creator 5.0.1

python - 从没有阴影的图像中提取主色的好方法是什么?

python - 检测网球场线拦截

c++ - 从另一个类对象调用常量函数

c++ - cin 直接到 vector<int>,当没有更多数据时中断循环

c++ - 在二叉搜索树中打印左子树和右子树

c++ - 如何保证单例不被过早销毁?

c++ - 用作初始值设定项的错误数组,我不知道错误

c++ - 如何在 vector<cv::Mat> 中找到相同的 cv::Mat