学习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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章