OpenCV寒假學習day03

OpenCV寒假學習day03

1.邏輯操作&取反操作

代碼

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char* argv[])
{
   
   
	// create image one
	Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3);
	Rect rect(100, 100, 100, 100);
	src1(rect) = Scalar(0, 0, 255);
	imshow("input1", src1);
	printf("create first image...\n");

	// create image two
	Mat src2 = Mat::zeros(Size(400, 400), CV_8UC3);
	rect.x = 150;
	rect.y = 150;
	src2(rect) = Scalar(0, 0, 255);
	imshow("input2", src2);
	printf("create second image...\n");

	// 邏輯操作
	Mat dst1, dst2, dst3;
	bitwise_and(src1, src2, dst1);
	bitwise_xor(src1, src2, dst2);
	bitwise_or(src1, src2, dst3);

	// show results
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);

	Mat src = imread("D:/vcprojects/images/test.png");
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);
	// 取反操作
	Mat dst;
	bitwise_not(src, dst);
	imshow("dst", dst);

	waitKey(0);
	return 0;
}

運行結果在這裏插入圖片描述

重要函數 功能
bitwise_and(src1,src2,dst) 逐元素按位與操作
bitwise_xor(src1,src2,dst) 逐元素按位“異或”操作
bitwise_or(src1,src2,dst) 逐元素按位或操作
bitwise_not(src,dst) 逐元素取反操作
Rect(x,y,width,height) 創建矩形

2.OpenCV通道分離與合併

代碼

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char* argv[])
{
   
   
	Mat src = imread("D:/vcprojects/images/flower.png");
	if (src.empty()) {
   
   
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	vector<Mat> mv;
	Mat dst1, dst2, dst3;
	// 藍色通道爲零
	split(src, mv);
	mv[0] = Scalar(0);
	merge(mv, dst1);
	imshow("output1", dst1);

	// 綠色通道爲零
	split(src, mv);
	mv[1] = Scalar(0);
	merge(mv, dst2);
	imshow("output2", dst2);

	// 紅色通道爲零
	split(src, mv);
	mv[2] = Scalar(0);
	merge(mv, dst3);
	imshow("output3", dst3);

	waitKey(0);
	return 0;
}

運行結果在這裏插入圖片描述

重要函數 功能
split(src,mv) 將src的多通道矩陣分成多個單通道矩陣並保留到Mat對象指針
merge(mv,dst) split的逆操作,把mv中的數組矩陣合併到dst中的矩陣

3.顏色空間轉換

代碼

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char* argv[])
{
   
   
	Mat src = imread("D:/vcprojects/images/dog.jpg");
	if (src.empty()) {
   
   
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	// RGB to HSV
	Mat hsv;
	cvtColor(src, hsv, COLOR_BGR2HSV);
	imshow("hsv", hsv);

	// RGB to YUV
	Mat yuv;
	cvtColor(src, yuv, COLOR_BGR2YUV);
	imshow("yuv", yuv);

	// RGB to YUV
	Mat ycrcb;
	cvtColor(src, ycrcb, COLOR_BGR2YCrCb);
	imshow("ycrcb", ycrcb);

	Mat src2 = imread("D:/vcprojects/images/greenback.png");
	imshow("src2", src2);
	cvtColor(src2, hsv, COLOR_BGR2HSV);
	Mat mask;
	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
	imshow("mask", mask);

	waitKey(0);
	return 0;
}

運行結果

在這裏插入圖片描述

重要函數
cvtColor(src,dst,code) 保留相同數據類型的同時從一個顏色空間轉換到另一個顏色空間
inRange(src,upperb,lowerb,dst) src的每個元素在upperb和lowerb中對應的校驗,如src中的元素爲upperb和lowerb之間的,則dst對應的元素爲255否則爲0

4.問題

暫無

5.總結

這次學習了像素的邏輯操作,圖像的通道分離與合併及顏色空間轉換。接下來需要了解的是有關於顏色空間的知識和,通道分離與合併的實用意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章