RGB代表红绿蓝。大多数情况下,RGB颜色存储在结构或无符号整数中,蓝色占据最不重要的“区域”(32位和24位格式的字节),绿色第二少,红色第三少。
BGR是相同的,除了区域顺序颠倒。红色占据最不重要的区域,绿色占第二位(静止),蓝色占第三位。
早期开发者使用BGR作为颜色的空间的原因在于:那个时候的BGR格式在相机制造厂商和软件提供商之间比较受欢迎。例如。在Windows中,当使用 COLORREF 指定颜色值时,使用BGR格式0x00bbggrr。
在opencv中,我们来看下如何读取图像,然后将 RGB 通道替换成 BGR 通道这样的Opencv通道交换。
下面的代码用于提取图像的红色通道。注意,cv2.imread() 的系数是按 BGR 顺序排列的!其中的变量 red 表示的是仅有原图像红通道的 imori.jpg。
Python实现:
import cv2
# Read image
img = cv2.imread("imori.jpg")
b = img[:, :, 0].copy()
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()
# RGB > BGR
img[:, :, 0] = r
img[:, :, 1] = g
img[:, :, 2] = b
# Save result
cv2.imwrite("out.jpg", img)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
C++实现:
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
int main(int argc, const char* argv[]){
cv::Mat img = cv::imread("imori.jpg", cv::IMREAD_COLOR);
int width = img.rows;
int height = img.cols;
cv::Mat out = img.clone();
for (int j=0; j<height; j++){
for (int i=0; i<width; i++){
unsigned char tmp = out.at<cv::Vec3b>(j, i)[0];
out.at<cv::Vec3b>(j, i)[0] = img.at<cv::Vec3b>(j,i)[2];
out.at<cv::Vec3b>(j,i)[2] = tmp;
}
}
//cv::imwrite("out.jpg", out);
cv::imshow("sample", out);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
输入(imori.jpg):
输出(out.jpg):