栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OpenCV3 C++ 图像的一些简单变换

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCV3 C++ 图像的一些简单变换

主要包括C++图像的高斯模糊、Canny边缘检测、降采样、读写像素值的实现

#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main(int argc, char** argv){

	Mat img = imread("F:/test/apple.jpg"); // 定义一个Mat(Matrix)容器用于存储图像
	if (img.empty()) return -1;
	namedWindow("imgRead", WINDOW_AUTOSIZE);  // WINDOW_FREERATIO可手动调节窗口大小


	//高斯模糊
	Mat out;
	GaussianBlur(img, out, Size(5, 5), 3, 3);
	imshow("GaussianProcess2", out);

	//色彩空间转换
	Mat gray, hsv;
	cvtColor(out, hsv, COLOR_BGR2HSV);
	cvtColor(out, gray, COLOR_BGR2GRAY);
	imshow("HSV", hsv);
	imshow("GRAY", gray);
	
	//高斯平滑处理后的Canny边缘检测
	Mat cny;
	Canny(gray, cny, 10, 100, 3, true);
	imshow("Canny", cny);
	//未经高斯平滑的Canny边缘检测
	Mat gray2, cny2;
	cvtColor(img, gray2, COLOR_BGR2GRAY);
	Canny(gray2, cny2, 10, 100, 3, true);
	imshow("Canny2", cny2);

	//降采样
	Mat down1, down2;
	pyrDown(img, down1);
	imshow("down1", down1);
	pyrDown(down1, down2);
	imshow("down2", down2);

	//读取指定坐标处的像素值
	int x = 16, y = 32;
	Vec3b intensity = img.at< Vec3b >(y, x);

	uchar blue = intensity[0];
	uchar green = intensity[1];
	uchar red = intensity[2];

	cout << "At (x,y) = (" << x << "," << y << "):(blue, green, red) = (" << (unsigned int)blue << "," << (unsigned int)green << "," << (unsigned int)red << ")" << endl;
	Mat gry;
	cvtColor(img, gry, COLOR_BGR2GRAY);
	cout << "Gray pixel there is:" << (unsigned int)gry.at(y, x) << endl;

	x /= 4, y /= 4;
	cout << "Pyramid2 pixel there is " << (unsigned int)down2.at(y, x) << endl;

	//Set the gray pixel there to 128
	gry.at(x, y) = 128;
	cout << "Gray reset pixel there is:" << (unsigned int)gry.at(x, y) << endl;


	imshow("imgRead", img);
	waitKey(0);
	destroyAllWindows();
}

高斯模糊函数:GaussianBlur()。5个参数分别为:输入图像、输出图像、高斯核的大小、高斯核函数在X方向的的标准偏差、高斯核函数在Y方向的的标准偏差。

色彩空间转换函数:cvtColor()。3个参数分别为:输入图像、输出图像、色彩空间转换方式。

Canny边缘检测函数:Canny()。6个参数分别为:输入图像(必须是单通道)、输出图像、第一个阈值、第二个阈值、Sobel 算子内核大小,最后一个参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加。而在两个阈值中,第一个阈值用来控制边缘连接,第二个阈值用来控制强边缘的初始分割。

降采样:pyrDown()。每次降采样都使图像的宽高分别缩小一半。

读取像素值部分:

定义一个类型为uchar长度为3的数组,at定位到(y, x)处的像素:

Vec3b intensity = img.at< Vec3b >(y, x);

 分别取出对应像素中三个通道的值:

uchar blue = intensity[0];
uchar green = intensity[1];
uchar red = intensity[2];

由于返回的使uchar类型的值,在cout输出时需要强制转换类型:

cout << "At (x,y) = (" << x << "," << y << "):(blue, green, red) = (" << (unsigned int)blue << "," << (unsigned int)green << "," << (unsigned int)red << ")" << endl;

结果图如下:

原图和高斯平滑后对比:

 色彩空间转换后:

 Canny边缘检测:高斯平滑后的边缘检测对比未经高斯平滑的边缘检测结果

两次降采样:

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号