b462 - 圖片亮度調整原理深度剖析
題目描述
題目要求對輸入的 RGB 圖片進行亮度調整,調整方式為對每個顏色通道 (R, G, B) 分別應用一個一次函數 f(x) = ax + b。需要確保調整後的像素值在 0 到 255 的範圍內,並進行四捨五入。
解題思路
題目給定了六個參數 aR, bR, aG, bG, aB, bB,分別對應 R, G, B 三個通道的一次函數的斜率和截距。程式碼讀取圖片的寬高 w, h,然後遍歷每個像素的 RGB 值,對每個顏色通道應用對應的一次函數,並將結果限制在 0 到 255 的範圍內。最後輸出調整後的圖片。
複雜度分析
- 時間複雜度: O(w * h),其中 w 是圖片的寬度,h 是圖片的高度。程式碼需要遍歷每個像素進行計算。
- 空間複雜度: O(1),程式碼只使用了常數級別的額外空間。
程式碼
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
double aR,bR,aG,bG,aB,bB,a,b,c;
int w,h;
cin >> aR >> bR >> aG >> bG >> aB >> bB >> w >> h;
cout << w << " " << h << "\n";
for(int i(0);i<h;++i){
for(int j(0);j<w;++j){
cin >> a >> b >> c;
a=a*aR+bR;
b=b*aG+bG;
c=c*aB+bB;
if(a<0)a=0;
if(b<0)b=0;
if(c<0)c=0;
if(a>255)a=255;
if(b>255)b=255;
if(c>255)c=255;
cout << round(a) << " " << round(b) << " " << round(c) << " ";
}
cout << "\n";
}
}