学习OpenCV(二)图像处理入门
程序员文章站
2022-05-29 09:26:35
...
本系列的目的是详解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
下一篇: 微信什么情况下会出现“对方正在输入”?