opencv基本操作 图像的卷积

本文通过实例演示了使用OpenCV库进行图像处理的各种技术,包括摄像头视频捕获、图像灰度转换、矩阵运算、图像边缘检测及高斯模糊等操作,并展示了如何利用OpenCV API简化这些任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;


void main(){
/* 
VideoCapture cap(0);//调用摄像头,0为默认摄像头,可接入其他摄像头


while (true)
{
Mat Frame;//创建了一个Mat对象
cap >> Frame;//摄像头信息读入到对象中


namedWindow("frame", 0);//新建了一个窗口;0:可自由调节大小;;1.不可调节;
imshow("frame", Frame);//在frame窗口中输出对象
waitKey(0);//显示完第一帧后等待10毫秒显示下一帧
}
*/


/*
Mat imggray=imread("123.jpg",0);//创建一个对象并将图片读入,图片必须在同目录下
//1表示彩色图,0为灰色图
cvtColor(imggray,imggray,CV_RGB2GRAY );//将彩色图转为黑白图
cout << (int)imggray.at<uchar>(1, 1) << endl;//读出imggray的第一行第一列像素值转为int型输出

imshow("123", imggray);//在123窗口中输出图片
waitKey(0);//第一帧后等待0毫秒,即无穷,表示只显示第一帧
*/


/*
Mat image = Mat::eye(5, 5, CV_64FC1);//创建5乘5的对角矩阵,数据类型为double
cout << image << endl;//输出该矩阵

Mat imgone = Mat::ones(5, 5, CV_64FC1);//创建5乘5的单位矩阵,数据类型为double
Mat sum = image + imgone;//两矩阵相加
cout << sum << endl;//输出相加后的矩阵;
*/



/*   //普通方法求导
VideoCapture cap(0);
while (true)
{
Mat Frame;
cap >> Frame;


namedWindow("123", 0);
cvtColor(Frame, Frame, CV_RGB2GRAY);

cout << "row" << Frame.rows << "col" << Frame.cols << endl;//输出Frame行和列的大小

Mat dimg = Mat(Frame.rows, Frame.cols-2,CV_8UC1);//用于存放对Frame X方向求导后的图像
//边缘两列不求导,故列数减2
for (int i = 0; i < Frame.rows; i++)//外层循环,对行循环,从0到Frame.rows-1行
{
for (int j = 1; j < Frame.cols-1; j++)//内层循环,对列循环,从第1列到Frame.cols-2列
{
dimg.at<uchar>(i, j - 1) = Frame.at<uchar>(i, j - 1) - Frame.at<uchar>(i, j + 1);
//求导
}
}


imshow("123",dimg);//输出求导后的图像
waitKey(10);
}
*/


/*   //卷积方式实现求导
VideoCapture cap(0);
while (true)
{
Mat Frame;
cap >> Frame;

namedWindow("123", 0);
cvtColor(Frame, Frame, CV_RGB2GRAY);
cout << "row" << Frame.rows << "col" << Frame.cols << endl;

Mat dimg = Mat(Frame.rows, Frame.cols - 2, CV_8UC1);

Mat model = Mat(1, 3, CV_64FC1);//创建一个模板
model.at<double>(0, 0) = 1;
model.at<double>(0, 1) = 0;
model.at<double>(0, 2) = -1;//模板元素为1,0,-1

for (int i = 0; i < Frame.rows; i++)//对Frame行循环
{
for (int j = 1; j < Frame.cols - 1; j++)//对Frame列循环
{
double sum = 0;
for (int m = 0; m < model.rows; m++)//对模板的行循环
{
for (int n = 0; n < model.cols; n++)//对模板的列循环
{
sum += (double)Frame.at<uchar>(i + m, j - 1 + n)*model.at<double>(m, n);
//对应位置的数相乘放到sum中
}
}
dimg.at<uchar>(i, j - 1) = (uchar)sum;//sum的值再赋给dimg的每个元素
}
}

imshow("123", dimg);//输出
waitKey(10);
}
*/


/*//高斯模糊
double sigma = 20;
Mat gauss(5, 5, CV_64FC1);//创建高斯模板
for (int i = -2; i < 3; i++)
{
for (int j = -2; j < 3; j++)
{
gauss.at<double>(i + 2, j + 2) = exp(-(i*i + j*j) / (2 * sigma*sigma));
//根据公式给高斯模板中各个元素赋值
}
}
double gssum = sum(gauss).val[0];//所有元素求和
for (int i = -2; i < 3; i++)
{
for (int j = -2; j < 3; j++)
{
gauss.at<double>(i + 2, j + 2) /= gssum;
//将高斯模板归一化
}
}

VideoCapture cap(0);
while (true)
{
Mat frame;
cap >> frame;
cvtColor(frame, frame, CV_RGB2GRAY);


Mat dimg = Mat(frame.rows - 4, frame.cols - 4, CV_8UC1);
//左右两列上下两行无法进行卷积运算,故各减4


for (int i = 2; i < frame.rows-2; i++)
{
for (int j = 2; j < frame.cols - 2; j++)
{
double sum = 0;
for (int m = 0; m < gauss.rows; m++)
{
for (int n = 0; n < gauss.cols ; n++)
{
sum += (double)frame.at<uchar>(i-2 + m, j-2+ n)*gauss.at<double>(m, n);
//与卷积求导同理
}
}
dimg.at<uchar>(i-2,j-2) = (uchar)sum;
}
}

namedWindow("frame", 0);


imshow("a", frame);
imshow("frame", dimg);
waitKey(10);
}
*/


    
VideoCapture cap(0);
while (true)
{
Mat frame, frame1, frame2, frame3;
cap >> frame;
cvtColor(frame, frame, CV_RGB2GRAY);


//API调用
GaussianBlur(frame, frame1, cvSize(5, 5), 10, 10);//高斯模糊
Canny(frame, frame2, 100, 100);//边缘检验
Sobel(frame, frame3, 0, 1, 1);//边缘检验


imshow("1", frame1);
imshow("2", frame2);
imshow("3", frame3);
waitKey(10);


}

system("pause");
}
### 使用OpenCV实现图像卷积处理 #### 图像卷积操作概述 图像卷积是一种常见的信号处理技术,在计算机视觉领域被广泛应用于滤波、边缘检测和其他图像增强任务中。通过定义一个卷积核(Kernel),可以对输入图像进行特定的操作,例如模糊化、锐化或边缘提取。 --- #### OpenCV中的图像卷积函数 OpenCV提供了多种用于执行图像卷积操作的函数,其中最常用的是`cv2.filter2D()`以及一些预定义的滤波器函数如`cv2.blur()`、`cv2.GaussianBlur()`等[^1]。 以下是几个主要的卷积相关函数及其用途: 1. **`cv2.filter2D()`** - 这是一个通用的二维卷积函数,允许用户自定义卷积核。 - 函数原型如下: ```cpp void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT ); ``` 参数说明: - `src`: 输入图像。 - `dst`: 输出图像。 - `ddepth`: 输出图像的深度。 - `kernel`: 自定义的卷积核矩阵。 - `anchor`: 卷积核的锚点,默认为中心位置。 - `borderType`: 边界填充方式。 2. **`cv2.blur()`** - 实现均值模糊效果,即将指定区域内的像素取平均值作为输出。 - 函数原型如下: ```cpp void blur( InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ); ``` 3. **`cv2.GaussianBlur()`** - 高斯模糊,基于高斯分布计算权重并加权求和得到目标像素值。 - 函数原型如下: ```cpp void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT ); ``` 4. **其他常见滤波器** - 中值滤波 (`cv2.medianBlur`) 和双边滤波 (`cv2.bilateralFilter`) 可分别用于去噪和平滑边界保持细节[^2]。 --- #### 示例代码:使用`cv2.filter2D()`实现自定义卷积核 下面展示了一个完整的Python示例代码,演示如何利用`cv2.filter2D()`来应用自定义卷积核。 ```python import cv2 import numpy as np # 加载原始图像 image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE) if image is None: raise ValueError("无法加载图片,请检查路径") # 定义一个3x3的卷积核(例如边缘检测算子) kernel = np.array([ [-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype=np.float32) # 应用卷积操作 result = cv2.filter2D(image, -1, kernel) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Convolution Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码实现了边缘检测的效果,因为所使用的卷积核强调了相邻像素之间的差异[^3]。 --- #### 示例代码:使用`cv2.blur()`实现均值模糊 如果只需要简单地对图像进行平滑处理,则可以直接调用`cv2.blur()`方法。 ```python import cv2 # 加载原始图像 image = cv2.imread('input_image.jpg') if image is None: raise ValueError("无法加载图片,请检查路径") # 执行均值模糊操作 blurred_image = cv2.blur(image, (5, 5)) # 设置卷积核大小为5x5 # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Blurred Image', blurred_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此代码片段展示了如何通过设置不同的卷积核尺寸调整模糊程度[^4]。 --- #### 总结 无论是采用内置的滤波器还是手动设计卷积核,OpenCV都提供了一套强大的工具集支持开发者灵活高效地完成各种图像处理需求。对于更复杂的场景,还可以结合多个步骤构建流水线式的解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值