OpenCV筆記(二)cvtColor與偽彩色亥啦、圖像復(fù)制與像素訪問

顏色空間轉(zhuǎn)換 cvtColor

該函數(shù)的文檔地址
函數(shù)原型:

void cv::cvtColor(InputArray src ,OutputArray dst,int code, int dstCn=0)
dst = cv2.cvtColor(src,code[,dst[,dstCn]])

dstCn :目標(biāo)圖像的通道數(shù)躯砰,默認(rèn)值是0,表示由src和code決定

code表示轉(zhuǎn)換標(biāo)識创倔,常見的BGR轉(zhuǎn)灰度COLOR_BGR2GRAY

官方文檔對code轉(zhuǎn)換碼的取值定義

eg.

Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
imwrite("gray.png", gray);
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
cv2.imwrite('gray.png',gray)

創(chuàng)建新圖:克隆復(fù)制與賦值

圖像克隆嗡害、復(fù)制與 賦值

Mat m1 = src.clone(); //克隆原圖像到新圖
// 將原圖src復(fù)制到新的圖像m2
Mat m2;
src.copyTo(m2);
// 賦值
Mat m3 = src;
// 創(chuàng)建新圖
Mat m4 = Mat::zeros(src.size(), src.type());
Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);
Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);
m1 = np.copy(src)  #復(fù)制原圖
# 賦值 切片訪問像素
m2 = src
src[100:200,200:300,:] = 255  # m2同步更改
# np創(chuàng)建新的矩陣
m3 = np.zeros(src.shape, src.dtype)
m4 = np.zeros([512,512], np.uint8)
m5 = np.ones(shape=[512,512,3], dtype=np.uint8)
m5[:,:,0] = 255

像素值的訪問

python版本的OpenCV,圖像數(shù)據(jù)就是numpy.array畦攘,訪問方式和數(shù)組一致霸妹,這個比較簡單略去。

c++版本的OpenCV知押,圖像數(shù)據(jù)是Mat類叹螟,訪問有十幾種方式鹃骂。參考了這篇博客https://blog.csdn.net/xiaowei_cqu/article/details/19839019

三種常用的是at模板函數(shù)的位置訪問、ptr指針和data罢绽。此外迭代器等方式也比較高效畏线。

#define CV_8U   0                   //對應(yīng)uchar
#define CV_8S   1                   //對應(yīng)char
#define CV_16U  2                   //對應(yīng)ushort
#define CV_16S  3                   //對應(yīng)short
#define CV_32S  4                   //對應(yīng)int
#define CV_32F  5                   //對應(yīng)float
#define CV_64F  6                   //對應(yīng)double
/*   使用模板 成員函數(shù)Mat.at<>() */
// 單通道數(shù)據(jù)
Mat img1(1,256,CV_8U);// 1行256列的  二維 單通道數(shù)組
uchar data = img1.at<uchar>(0,10); // 訪問img1的第一行第11個值 <>中的值由元素的類型決定,上面的定義是對應(yīng)關(guān)系

Mat img2(1,256,CV_32FC3);//1行256的 二維3通道數(shù)組
float data = img2.at<cv::Vec3f>(0,10)[0]; //img2的第一行第11個位置 第一個通道良价,三通道的<>參數(shù)是vec3f這種寝殴,返回的是該位置的三個通道數(shù)據(jù),因此需要[]索引訪問三個不同的通道的值明垢。 8UC3對應(yīng)Vec3b

/* 使用ptr指針 */
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC1); 
for (int i=0; i<ROWS ; i++)   
{   
    float* pData1=img5.ptr<float>(i);  
    for (int j=0; j<COLS ; j++)   
    {   
        pData1[j] = 3.2f;   
    }   
}

/* Mat.data  */
Mat img(1,256,CV_8U);
uchar *p = img.data;
for(int i=0;i<256;i++){
    p[i] = 255 -i; //像素值翻轉(zhuǎn)
}

偽彩色

將灰度圖映射成偽彩色的圖像蚣常,即將灰度圖像的像素灰度值按照線性或者非線性函數(shù)映射到彩色空間,從而使呈現(xiàn)出彩色的顯示效果痊银。

applyColorMap

OpenCV提供的12種彩色圖定義如下抵蚊,函數(shù)是applyColorMap。


12種偽彩色轉(zhuǎn)換
void cv::applyColorMap(InputArray src,OutputArray dst,InputArray userColor) 
dst =  cv2.applyColorMap(src, colormap[, dst])
dst =  cv2.applyColorMap(src, userColor[, dst])

該函數(shù)的輸入src可以是灰度圖溯革,也可以是bgr三通道的圖片贞绳。

import cv2
src = cv2.imread('alpha.png')
gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
dst =  cv2.applyColorMap(src,cv2.COLORMAP_RAINBOW)
#ccv2.imshow("src",src)
cv2.imshow("gray",gray)
cv2.imshow("color",dst)
cv2.waitKey(0)

顯示效果如下,偽彩色將灰度圖的各個灰度值映射成彩色致稀。

image.png

LUT查找表實現(xiàn)偽彩色

applycolormap只能使用12種固定的彩色映射熔酷,如要實現(xiàn)自定義的偽彩色需要使用cv::LUT,自定義一個查找表豺裆,然后將灰度值進行映射拒秘。比如定義的colormap,256灰度級的查找表table臭猜,將原始灰度值翻轉(zhuǎn)躺酒,table[i] = 255 - i 將原始灰度值取反。

void cv :: LUT(InputArray   src蔑歌,InputArray  lut羹应,OutputArray DST )
DST =cv2.LUT(src,lut [次屠,dst] )

自定義查找表园匹,實現(xiàn)灰度值翻轉(zhuǎn)的功能。

import cv2
import numpy as np
src = cv2.imread('123333.PNG')
gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
#dst=  cv2.applyColorMap(src,cv2.COLORMAP_RAINBOW)
#cv2.imshow("src",src)
table = np.zeros((1,256),gray.dtype) #對單通道灰度圖作偽彩色劫灶,因此是1,256當(dāng)然可以定義(3,256)對三通道的分量作不同的映射
print(table.shape)
for i in range(len(table[0])):
    table[0][i] = 255 - i # 將每個元素的原始灰度值翻轉(zhuǎn)裸违,這個操作若是有溢出就需要判斷,255-i不會溢出
    '''if table[0][i] >255:
        table[0][i]=255
    if table[0][i]<0:
        table[0][i]=0'''
dst =cv2.LUT(gray,table)
#cv2.imshow("src",src)
cv2.imshow("gray",gray)
cv2.imshow("color",dst)
cv2.waitKey(0)

顯示效果如下圖


灰度圖顏色翻轉(zhuǎn)

c++版本實現(xiàn)如下

Mat table(1, 256, CV_8U);
uchar *p = table.data;
for (int i = 0; i < 256; i++) {
    //img.at<float>(row,col)
    //table.at<uchar>(0,i) = 255 - i; //等價于p[i]訪問像素值 
    p[i] = 255 - i;
}
Mat src = imread("123333.PNG");
Mat gray本昏,dst;
cvtColor(src, gray, COLOR_BGR2GRAY); // 圖像灰度化
LUT(gray, table, dst); // 將灰度化的圖像使用LUT映射
imshow("color", dst);
imshow("Second", gray);
waitKey(0);
return 0;
c++實現(xiàn)

對三通道彩色圖做映射

#include <opencv2/imgcodecs.hpp>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
    Mat table(1, 256, CV_8UC3);
    for (int i = 0; i < 256; i++) {
        //img.at<cv::Vec3b>(row,col) 對各個通道的灰度映射如下
        table.at<cv::Vec3b>(0,i)[1] =  255 - i; // 還可以每個通道映射方式不一樣
        table.at<cv::Vec3b>(0, i)[0] = 255 - i;// *5 <0 ? 0: 255 - i*5; 
        table.at<cv::Vec3b>(0, i)[2] = 255 - i;// *15<0 ? 0: 255 - i*15; 
    
    }
    Mat src = imread("C:\\Users\\muyi\\Desktop\\pyproject\\123333.PNG");
    Mat dst;
    LUT(src, table, dst);
    imshow("src", src);
    imshow("color", dst);
    waitKey(0);
    return 0;
}

效果如下:


映射效果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末供汛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怔昨,老刑警劉巖雀久,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趁舀,居然都是意外死亡赖捌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門矮烹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來越庇,“玉大人,你說我怎么就攤上這事擂送。” “怎么了唯欣?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵嘹吨,是天一觀的道長。 經(jīng)常有香客問我境氢,道長蟀拷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任萍聊,我火速辦了婚禮问芬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寿桨。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布肩钠。 她就那樣靜靜地躺著榆俺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪预烙。 梳的紋絲不亂的頭發(fā)上墨微,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音扁掸,去河邊找鬼翘县。 笑死,一個胖子當(dāng)著我的面吹牛谴分,可吹牛的內(nèi)容都是我干的锈麸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺蹄,長吁一口氣:“原來是場噩夢啊……” “哼掐隐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤虑省,失蹤者是張志新(化名)和其女友劉穎匿刮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體探颈,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡熟丸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伪节。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片光羞。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怀大,靈堂內(nèi)的尸體忽然破棺而出纱兑,到底是詐尸還是另有隱情,我是刑警寧澤化借,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布潜慎,位于F島的核電站,受9級特大地震影響蓖康,放射性物質(zhì)發(fā)生泄漏铐炫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一蒜焊、第九天 我趴在偏房一處隱蔽的房頂上張望倒信。 院中可真熱鬧,春花似錦泳梆、人聲如沸鳖悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竞穷。三九已至,卻和暖如春鳞溉,著一層夾襖步出監(jiān)牢的瞬間瘾带,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工熟菲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留看政,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓抄罕,卻偏偏與公主長得像允蚣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呆贿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容