顏色空間轉(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
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。
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)
顯示效果如下,偽彩色將灰度圖的各個灰度值映射成彩色致稀。
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)
顯示效果如下圖
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;
對三通道彩色圖做映射
#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;
}
效果如下: