jashliao 用 VC++ 實現 fanfuhan OpenCV 教學007 ~ opencv-007-圖像像素之邏輯(AND、OR、XOR、NOT)運算操作 [使用顏色特性,圖片預先處理,藉此凸顯/過濾特徵點]
jashliao 用 VC++ 實現 fanfuhan OpenCV 教學007 ~ opencv-007-圖像像素之邏輯(AND、OR、XOR、NOT)運算操作 [使用顏色特性,圖片預先處理,藉此凸顯/過濾特徵點]
資料來源: https://fanfuhan.github.io/
https://fanfuhan.github.io/2019/03/24/opencv-007/
GITHUB:https://github.com/jash-git/fanfuhan_ML_OpenCV
https://github.com/jash-git/jashliao-implements-FANFUHAN-OPENCV-with-VC
★前言:
★主題:
OPENCV提供圖像邏輯運算功能函數,使用者可以利用顏色特性,對圖片進行預先處理,藉此凸顯/過濾特徵點。
邏輯運算功能函數條列如下:
bitwise_and(src1, src2, dst1);//進行AND運算
bitwise_xor(src1, src2, dst2);//XOR運算
bitwise_or(src1, src2, dst3);//OR運算
bitwise_not(src, dst);//NOT運算
★C++
// VC_FANFUHAN_OPENCV001.cpp : 定義主控台應用程式的進入點。 // /* // Debug | x32 通用屬性 | C/C++ | | 一般 | | 其他 Include 目錄 -> C:\opencv\build\include | | 連結器 | |一一般 | | 其他程式庫目錄 -> C:\opencv\build\x64\vc15\lib | | |一輸入 | | 其他相依性 -> opencv_world411d.lib;%(AdditionalDependencies) // Releas | x64 組態屬性 | C/C++ | | 一般 | | 其他 Include 目錄 -> C:\opencv\build\include | | 連結器 | |一般 | | 其他程式庫目錄 -> C:\opencv\build\x64\vc15\lib | | |一輸入 | | 其他相依性 -> opencv_world411.lib;%(AdditionalDependencies) */ #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; void pause() { printf("Press Enter key to continue..."); fgetc(stdin); } int main() { // create image one, CV_8UC3创建三通道图像 Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3); Rect rect(100, 100, 100, 100);//定義一個矩形 // Scalar() 参数为BGR三通道值,绿色和红色加起来是黄色 可可//將矩形範圍填滿黃色 imshow("input1", src1); // 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); // 逻辑操作 Mat dst1, dst2, dst3; bitwise_and(src1, src2, dst1);//進行AND運算 bitwise_xor(src1, src2, dst2);//XOR運算 bitwise_or(src1, src2, dst3);//OR運算 imshow("and", dst1); imshow("xor", dst2); imshow("or", dst3); // 演示取反操作 Mat src = imread("../../images/test1.jpg"); Mat dst; if (src.empty()) { cout << "could not load image..." << endl; pause(); return -1; } else { imshow("input", src); bitwise_not(src, dst);//NOT運算 imshow("input_not", dst); } waitKey(0); return 0; }
★Python
import cv2 as cv import numpy as np # create image one src1 = np.zeros(shape=[400, 400, 3], dtype=np.uint8) src1[100:200, 100:200, 1] = 255 src1[100:200, 100:200, 2] = 255 cv.imshow("input1", src1) # create image two src2 = np.zeros(shape=[400, 400, 3], dtype=np.uint8) src2[150:250, 150:250, 2] = 255 cv.imshow("input2", src2) dst1 = cv.bitwise_and(src1, src2) dst2 = cv.bitwise_xor(src1, src2) dst3 = cv.bitwise_or(src1, src2) cv.imshow("dst1", dst1) cv.imshow("dst2", dst2) cv.imshow("dst3", dst3) src = cv.imread("../images/test1.jpg") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) dst = cv.bitwise_not(src) cv.imshow("dst", dst) cv.waitKey(0) cv.destroyAllWindows()
★結果圖:
★延伸說明/重點回顧:
OPENCV預設建立的畫布為黑色
OPENCV內建Rect類別可以標定一個矩形座標範圍
OPENCV可以利用Rect類別+Scalar函數對特定畫布的特定區域進行顏色指定(上色)
OPENCV的黑色為Scalar(0,0,0);白色為Scalar(255,255,255)