日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

灰度图象,像素反转,对比度及亮度调值, 以及两张相同大小图片的混合

發布時間:2023/12/19 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 灰度图象,像素反转,对比度及亮度调值, 以及两张相同大小图片的混合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、圖像的像素變換:

1.灰度圖像生成:

前面用python實現過灰度轉換:https://www.cnblogs.com/Jack-Elvis/p/10971603.html

灰度圖像的生成辦法是由彩色圖像的三個通道的像素值取均值后賦給單通道的灰度圖像值:

C++代碼實現

(1)opencv的API代碼如下:

1.輸入圖像(彩色) 2.自定義的輸出圖像 3.方法,BGR —GRAY

(2)不用opencvAPI代碼實現:

生成一個灰度大小的矩陣:

核心步驟:

RGB到灰度圖轉換公式:Y' = 0.299 R + 0.587 G + 0.114 B 也可以用 Y=(R+G+B)/3

代碼如下:

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

using namespace cv;
using namespace std;
int main(int argc, char** args) {
    Mat image = imread("L:/4.jpg", IMREAD_COLOR);
    if (image.empty()) {
        cout << "could not find the image resource..." << std::endl;
        return -1;
    }
    namedWindow("input", CV_WINDOW_AUTOSIZE);
    imshow("input", image);
    
    Mat gray_image;
    gray_image.create(image.size(),IMREAD_GRAYSCALE);

    int height = image.rows;
    int width = image.cols;
    for (int row = 0; row < height; row++)
    {
        for (int  col = 0; col < width; col++)
        {
            int b = image.at<Vec3b>(row, col)[0];
            int g = image.at<Vec3b>(row, col)[1];
            int r = image.at<Vec3b>(row, col)[2];
            int gray =0.114*b +0.587*g + 0.299*r ; 
            // int gray =(b +g + r)/3 ; 
            gray_image.at<uchar>(row, col) = gray;
            
        
        }
    }

    namedWindow("output", CV_WINDOW_AUTOSIZE);
    imshow("output", gray_image);  
           waitKey(0);
    return 0;
}

效果圖:

二、圖像灰度值反轉:

圖像的反轉原理很簡單,每個像素的色度的范圍為(0-255)彩色為r,g,b,三個通道。灰度圖像只有一個通道即黑白(0-255)。

顏色的反轉:就是用255-原來的像素值=新的像素值 從而達到像素翻轉的效果。

與上面就一行代碼變化:替換就行了

代碼如下:

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

using namespace cv;
using namespace std;
int main(int argc, char** args) {
    Mat image = imread("L:/4.jpg", IMREAD_COLOR);
    if (image.empty()) {
        cout << "could not find the image resource..." << std::endl;
        return -1;
    }
    namedWindow("input", CV_WINDOW_AUTOSIZE);
    imshow("input", image);
Mat  gray_image1;
    gray_image1.create(image.size(), IMREAD_GRAYSCALE);

    int height = image.rows;
    int width = image.cols;
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int b = image.at<Vec3b>(row, col)[0];
            int g = image.at<Vec3b>(row, col)[1];
            int r = image.at<Vec3b>(row, col)[2];
            int gray = (b + g + r) / 3;
            gray_image1.at<uchar>(row, col) =255 - gray;


        }
    }
            
    namedWindow("output1", CV_WINDOW_AUTOSIZE);
    imshow("output1", gray_image1);
     

    waitKey(0);
    return 0;
}

效果:

反彩色圖像原理一樣這里就不在展示了。

二、圖像的對比度亮度調整:

這里首先給出一個公式:F= α(f) + β f為原像素值, F為變化后的像素值。

其中α控制的為對比度,β控制亮度。

核心操作:

彩色

灰度

原代碼如下

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("L:/4.jpg");
if (!src.data) {
printf("could not load image...
");
return -1;
}
char input_win[] = "input image"; //定義一個變量input_win來表示窗口名
//cvtColor(src, src, CV_BGR2GRAY);
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);

// contrast and brigthtness changes
int height = src.rows;
int width = src.cols;
dst = Mat::zeros(src.size(), src.type());
float alpha = 1.0;
float beta = 100;

Mat m1;
src.convertTo(m1, CV_32F); //強制轉化浮點型,提高精度
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (src.channels() == 3) {
float b = m1.at<Vec3f>(row, col)[0];// blue
float g = m1.at<Vec3f>(row, col)[1]; // green
float r = m1.at<Vec3f>(row, col)[2]; // red

// output
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src.channels() == 1) {
float v = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}

char output_title[] = "contrast and brightness change demo";
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(output_title, dst);

waitKey(0);
return 0;
}

效果

α=1,β=100, 整體提高亮度。

α=1.8,β=0,提高圖片的對比度

三、兩張圖片的適應疊加

f0表示圖一的像素,f1表示圖二的像素。

核心操作:

addWeight API (圖像1, α, 圖像2, 1-α, 0.0, 生成圖像

原代碼如下:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    Mat src1, src2, dst;
    src1 = imread("L:/opencv_picture/3.jpg");
    src2 = imread("L:/opencv_picture/4.jpg");
    if (!src1.data) {
        cout << "could not load image Linux Logo..." << endl;
        return -1;
    }
    if (!src2.data) {
        cout << "could not load image WIN7 Logo..." << endl;
        return -1;
    }

    double alpha = 0.5;
    if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {
        addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
        // multiply(src1, src2, dst, 1.0);

        imshow("linuxlogo", src1);
        imshow("win7logo", src2);
        namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
        imshow("blend demo", dst);
    }
    else {
        printf("could not blend images , the size of images is not same...
");
        return -1;
    }

    waitKey(0);
    return 0;
}

效果:

總結

以上是生活随笔為你收集整理的灰度图象,像素反转,对比度及亮度调值, 以及两张相同大小图片的混合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。