學習OpenCV:圖像處理入門

本系列的目的是詳解demo代碼,快速學習OpenCV相關操作

平滑處理

//平滑處理
//指定輸入圖像,進行平滑操作後輸出

#include <opencv2/opencv.hpp>

void example2_5( const cv::Mat & image ) {
	//創建兩個窗口顯示輸入和輸出的圖像
	cv::namedWindow( "Example2_5-in", cv::WINDOW_AUTOSIZE );
	cv::namedWindow( "Example2_5-out", cv::WINDOW_AUTOSIZE );
	// 在窗口中顯示輸入圖像
	cv::imshow( "Example2_5-in", image );
	// 創建一個圖像來保存平滑後的輸出圖像
	cv::Mat out;
	// ( 可以使用不同的平滑算子 GaussianBlur(), blur(), medianBlur() or bilateralFilter(). )
	// 對image每個像素周圍5*5的區域進行高斯平滑處理,寫入out
	cv::GaussianBlur( image, out, cv::Size(5,5), 3, 3);
	// 對out進行相同的高斯處理,再寫入out
	// 這一步是爲了說明輸入、輸出圖像可以是相同的,這種情況下會根據所需自動臨時分配內存
	cv::GaussianBlur( out, out, cv::Size(5,5), 3, 3);
	// 在輸出窗口顯示平滑後的圖像
	cv::imshow( "Example2_5-out", out );
	// 等待用戶鍵盤輸入任意鍵退出程序
	cv::waitKey( 0 );
}

縮放處理

//縮放處理(降採樣和上採樣)
//使用cv::pyrDown()函數創建一幅高度和寬度爲輸入圖像一半尺寸的圖像

#include <opencv2/opencv.hpp>
	int main( int argc, char** argv ) {
	
	cv::Mat img1,img2;
	cv::namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
	cv::namedWindow( "Example2", cv::WINDOW_AUTOSIZE );
	
	img1 = cv::imread( argv[1] );
	cv::imshow( "Example1", img1 );
	//img1爲輸入圖像,img2爲輸出圖像
	cv::pyrDown( img1, img2);
	
	cv::imshow( "Example2", img2 );
	cv::waitKey(0);
	return 0;
};

Canny邊緣檢測

//Canny邊緣檢測
//Canny邊緣檢測將輸出寫入單通道(灰度)圖像

#include <opencv2/opencv.hpp>
int main( int argc, char** argv ) {

	cv::Mat img_rgb, img_gry, img_cny;
	
	cv::namedWindow( "Example Gray", cv::WINDOW_AUTOSIZE );
	cv::namedWindow( "Example Canny", cv::WINDOW_AUTOSIZE );
	
	img_rgb = cv::imread( argv[1] );
	// 將rgb三通道圖像轉換爲單通道(灰度級)圖像
	// 因爲Canny算子只能處理灰度圖
	cv::cvtColor( img_rgb, img_gry, cv::COLOR_BGR2GRAY);
	cv::imshow( "Example Gray", img_gry );
	//利用Canny算子進行邊緣檢測
	//參數分別爲 輸入圖像,輸出圖像,低閾值,高閾值,Sobel算子內核大小
	//低閾值用來控制邊緣連接,高的閾值用來控制強邊緣的初始分割
	cv::Canny( img_gry, img_cny, 10, 100, 3, true );
	cv::imshow( "Example Canny", img_cny );
	cv::waitKey(0);
}

獲取和設置像素

//獲取和設置像素

//設置要讀取的座標點
int x = 16, y = 32;
// Vec3b代表8U類型的RGB彩色圖像,三維數組,用法類似Vector
//.at(int y, int x)函數可以用來存取圖像中對應座標爲(x,y)的元素座標
//.at是用模板函數實現的
cv::Vec3b intensity = img_rgb.at< cv::Vec3b >(y, x);

//賦值就可以完成設置像素操作
uchar blue  = intensity[0];

uchar green = intensity[1];

uchar red   = intensity[2];
std::cout << "At (x,y) = (" << x << ", " << y <<"): (blue, green, red) = (" <<(unsigned int)blue <<", " << (unsigned int)green << ", " <<(unsigned int)red << ")" << std::endl;

std::cout << "Gray pixel there is: " <<(unsigned int)img_gry.at<uchar>(y, x) << std::endl;

x /= 4; y /= 4;

std::cout << "Pyramid2 pixel there is: " <<(unsigned int)img_pyr2.at<uchar>(y, x) << std::endl;
img_cny.at<uchar>(x, y) = 128; // Set the Canny pixel there to 128
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章