C++?opencv圖像處理實(shí)現(xiàn)灰度變換示例
灰度變換概念
在圖像預(yù)處理中,圖像的灰度變換是圖像增強(qiáng)的重要手段,灰度變換可以使圖像對比度擴(kuò)展,圖像清晰,特征明顯,灰度變換主要利用點(diǎn)運(yùn)算來修正像素灰度,由輸入像素點(diǎn)的灰度值確定相應(yīng)輸出點(diǎn)的灰度值,是一種基于圖像變換的操作。
灰度變換的作用
1.改善圖像是質(zhì)量,顯示更多的細(xì)節(jié),提高圖像的對比度
2.有選擇的突出圖像感興趣的特征或者抑制圖像中不需要的特征
3.可以有效的改變圖像的直方圖的分布,使像素的分布更加均勻
灰度變換的方法
1.線性灰度變換
2.非線性灰度變換(對數(shù)變換,冪律變換(伽馬變換))
灰度化
灰度的概念
在數(shù)字圖像中,像素是基本的表示單位,各個像素的亮安程度用灰度值來標(biāo)識,只含亮度信息,不含色彩信息的圖像稱為灰度圖像,對于單色圖像,它的每個像素的灰度值用【0,255】區(qū)間的整數(shù)表示,即圖像分為256個灰度等級,對于彩色圖像,他的每個像素由R,G,B三個單色調(diào)配而成,如果每個像素的R,G,B完全相同,也就是R=G=B=D,該圖像就是灰度圖像,其中D被稱為各個像素的灰度值。
對彩色圖進(jìn)行灰度化
1.加權(quán)平均值法
D=0.299R+0.587G+0.114*B
代碼如下:
#include<iostream> #include<opencv.hpp> using namespace std; using namespace cv; int main() { Mat img, img2; img = imread("貓1.jpg"); imshow("原圖", img); img2.create(img.size(), 0); for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { img2.at<uchar>(i, j) = saturate_cast<uchar>(0.114*img.at<Vec3b>(i, j)[0] + 0.587*img.at<Vec3b>(i, j)[1] + 0.299*img.at<Vec3b>(i, j)[2]); } } imshow("經(jīng)驗(yàn)公式", img2); waitKey(0); }
效果如下:
2.取最大值
代碼如下:
int main() { Mat img, img2; img = imread("貓1.jpg"); imshow("原圖", img); img2.create(img.size(), 0); for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { int max = img.at<Vec3b>(i, j)[0]; for (int x = 0; x < 3; x++) { if (max < img.at<Vec3b>(i, j)[x]) { max = img.at<Vec3b>(i, j)[x]; } } img2.at<uchar>(i, j) = saturate_cast<uchar>(max); } } imshow("最大值", img2); waitKey(0); }
3.平均值
代碼如下:
int main() { Mat img, img2; img = imread("貓1.jpg"); imshow("原圖", img); img2.create(img.size(), 0); for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { img2.at<uchar>(i, j) = saturate_cast<uchar>((img.at<Vec3b>(i, j)[0] + img.at<Vec3b>(i, j)[1] + img.at<Vec3b>(i, j)[2])/3); } } imshow("平均值", img2); waitKey(0); }
灰度的線性變換
圖像的線性變換是圖像處理的基本運(yùn)算,通常應(yīng)用在調(diào)整圖像的畫面質(zhì)量方面,如圖像對比度,亮度及反轉(zhuǎn)等操作。灰度的線性變換就是將圖像中所有點(diǎn)的灰度按照線性灰度變換函數(shù)進(jìn)行變換。
1.線性變換
y=kx+b;
代碼如下:
int main() { Mat img1, img2; img1 = imread("貓1.jpg", 1); imshow("原圖", img1); img2 = Mat::zeros(img1.size(), 0); for (int i = 0; i < img1.rows; i++) { for (int j = 0; j < img1.cols; j++) { for (int s = 0; s < 3; s++) { img2.at<uchar>(i, j) = saturate_cast<uchar>(1.1*img1.at<Vec3b>(i, j)[s] + 20); } } } imshow("線性", img2); waitKey(0); }
效果如下:
2.分段線性變換
代碼如下:
int main() { Mat img1, img2; img1 = imread("貓1.jpg", 0); imshow("原圖", img1); img2 = Mat::zeros(img1.size(), 0); for (int i = 0; i < img1.rows; i++) { for (int j = 0; j < img1.cols; j++) { uchar temp = img1.at<uchar>(i, j); if (temp <=70) { img2.at<uchar>(i, j) = saturate_cast<uchar>(0.5*temp + 20); } else if (temp > 70 && temp <= 150) { img2.at<uchar>(i, j) = saturate_cast<uchar>(1.2*temp + 100); } else if (temp > 150 && temp <= 255) { img2.at<uchar>(i, j) = saturate_cast<uchar>(0.9*temp + 55); } } } imshow("分段線性", img2); waitKey(0); }
效果如下:
灰度的非線性變換
對數(shù)變換和分對數(shù)變換都屬于非線性變換
1.對數(shù)變換
對數(shù)變換能增強(qiáng)圖像暗部的細(xì)節(jié)
代碼如下:
int main() { double c = 1.2; Mat img1, img2, img3; img1 = imread("貓1.jpg",0); img3 = Mat::ones(img1.size(), CV_32FC3); add(img1, Scalar(1.0), img1); img1.convertTo(img1, CV_32F); log(img1, img3); img3 = c*img3; normalize(img3, img3, 0, 255, NORM_MINMAX);//歸一化到0-255 NORM_MINMAX 線性歸一化 convertScaleAbs(img3, img3);//轉(zhuǎn)換成8bit通道顯示 imshow("對數(shù)變換", img3); waitKey(0); }
效果如下:
2.冪律變換
冪律變換也稱伽馬變換或指數(shù)變換,主要用于圖像的校正,對漂白的圖片或過黑的圖片進(jìn)行修正,增強(qiáng)對比度
代碼如下:
int main() { Mat img1, img2; img1 = imread("貓1.jpg",0); img2.create(img1.size(), img1.type()); for (int i = 0; i < img1.rows; i++) { for (int j = 0; j < img1.cols; j++) { int gray = img1.at<uchar>(i, j); img2.at<uchar>(i, j) = saturate_cast<uchar>(pow(gray,0.5)); } } normalize(img2, img2, 0, 255, NORM_MINMAX); imshow("冪律變換", img2); waitKey(0); }
效果如下:
總結(jié)
以上就是本文的全部內(nèi)容,本文簡單介紹了灰度化以及灰度變換的一些基礎(chǔ)知識,更多關(guān)于C++ opencv灰度變換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼
在Matlab下,使用imfill可以很容易的完成孔洞填充操作,下面這篇文章主要給大家介紹了關(guān)于C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10