opencv c++ 图像卷积(27)(自定义卷积、滤波)

 1、图像卷积:

用一个小于图像的矩阵窗口在图像上按照一定的步长移动,在窗口覆盖的图像对应区域内,将对应像素点与窗口权值进行乘法操作,再将所有的乘积相加再除以窗口尺寸,作为该步移动的输出

这里的窗口一般被称为卷积核(kernal),卷积核中的元素被称为权值。

注意,当输入图像通道数为多个时,对应的卷积核也有同样的通道数量。

更多解释参考:

(25条消息) 深度学习之卷积_冰激凌啊的博客-CSDN博客_卷积 深度学习

API:

 这里的blur函数步长始终为1。

代码:

void QuickDemo::blur_demo(Mat& image)
{
	Mat dst;
	blur(image, dst, Size(3, 3), Point(-1, -1));
	imshow("卷积图像", dst);
}

结果:

2、自定义卷积(滤波)

生成自定义的卷积核进行滤波操作,相关API如下:

filter2D(input_img, output_img, ddepth, kernel, anchor, delta, borderType)

input_img——输入图像

output_img——输出图像

ddepth——所需输出图像的深度,参考如下:

 kernel——自定义的卷积核(Mat)

anchor——锚点,卷积核对应输出图像上像素点,默认Point(-1,-1)为卷积核中心

delta——在卷积完成后,生成输出图像前,将输出图像所有像素点值均加上的值(亮度调节)

borderType——边界选取方法(具体看官方文档)。

convertScaleAbs(input_img, output_img) 

这个API的作用为将图像格式转为CV_8U格式,并将所有像素值置为正。

简单自定义Mat方法:

Mat mat_1 = (Mat_<数据类型>(高,宽) <<  高×宽个对应数据类型的像素值) 

 代码示例(均值滤波核非均值滤波):

void self_conv(Mat& image)
{
	//均值滤波
	//定义核
	int k = 15;//窗口尺寸
	Mat selfkernel = Mat::ones(Size(k, k), CV_32F)/(float)(k*k);//后面除(float)(k*k)让所有权值和为1.

	//调用API进行滤波
	Mat dst;
	filter2D(image, dst, -1, selfkernel, Point(-1, -1), 0, BORDER_DEFAULT);

	namedWindow("mean filter img", WINDOW_FREERATIO);
	imshow("mean filter img", dst);

	//非均值滤波
	Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);//自定义Mat核
	Mat dst2;
	filter2D(image, dst2, CV_32F, robot, Point(-1, -1), 0, BORDER_DEFAULT);
	convertScaleAbs(dst2, dst2);//该API将图像格式转为CV_8U格式,并将所有像素值置为正。
	namedWindow("non_mean filter img", WINDOW_FREERATIO);
	imshow("non_mean filter img", dst2);
}

注意:

        当均值滤波时,ddepth使用默认值即可,但当采用非均值滤波时,为防止数据溢出,需采用较大的浮点储存空间模式,如上采用了CV_32F。

输出:

 将非均质滤波filter2D里的delta值设为127,有:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用OpenCV实现车辆颜色识别,可以按照以下步骤: 1. 安装OpenCV库并配置环境。 2. 读取图像,可以使用cv::imread()函数。 3. 将图像转换为HSV颜色空间,可以使用cv::cvtColor()函数。 4. 定义要识别的颜色范围,例如红色可以定义为HSV颜色空间中的(0, 100, 100)到(10, 255, 255)。 5. 对图像进行颜色过滤,只保留符合颜色范围的像素,可以使用cv::inRange()函数。 6. 对过滤后的图像进行形态学操作,例如膨胀和腐蚀,可以使用cv::dilate()和cv::erode()函数。 7. 使用cv::findContours()函数找到图像中的轮廓。 8. 遍历所有轮廓,计算每个轮廓的面积和中心点坐标。 9. 根据中心点坐标判断车辆的位置和颜色。 以下是一个简单的示例代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像 Mat img = imread("car.jpg"); // 转换颜色空间为HSV Mat hsv; cvtColor(img, hsv, COLOR_BGR2HSV); // 定义红色范围 Scalar lower_red = Scalar(0, 100, 100); Scalar upper_red = Scalar(10, 255, 255); // 过滤颜色 Mat mask; inRange(hsv, lower_red, upper_red, mask); // 形态学操作 Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5)); dilate(mask, mask, kernel); erode(mask, mask, kernel); // 查找轮廓 vector<vector<Point>> contours; findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 遍历轮廓 for (int i = 0; i < contours.size(); i++) { // 计算轮廓面积和中心点 double area = contourArea(contours[i]); Moments moments = moments(contours[i]); Point center(moments.m10 / moments.m00, moments.m01 / moments.m00); // 判断车辆位置和颜色 if (area > 1000) { cout << "车辆位置:" << center << endl; cout << "车辆颜色:红色" << endl; } } return 0; } ``` 注意,在实际应用中,可能需要根据具体情况调整颜色范围和形态学操作的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值