自定义OpenCV腐蚀膨胀算法实现与代码详解
本资源是一份基于OpenCV的图像腐蚀和膨胀操作的C++源代码实现,主要针对灰度图像处理,不依赖OpenCV内置的腐蚀和膨胀函数。以下是关键知识点的详细解释: 1. **图像类型转换**: `MatRGB2GRAY(const Matsrc)` 函数用于将输入的彩色图像(Mat类型的`Vec3b`)转换为灰度图像。这里通过计算每个像素点的RGB值的线性组合(R * 0.299 + G * 0.587 + B * 0.114),将彩色图像转换为灰度图像,存储在`uchar`类型的`Mat`对象`dst`中。 2. **阈值处理**: `floatThreshold(const Matsrc)` 函数用于计算输入灰度图像的平均灰度值,作为后续二值化操作的阈值。它遍历整个图像,累加所有像素值,最后返回平均值作为阈值。 3. **二值化**: `MatGRAYtoBinaryzation(const Matsrc, float threshold)` 函数将灰度图像转换为二值图像。如果灰度值大于或等于给定的阈值(`threshold`),对应像素被设为白色(255),否则设为黑色(0),形成一个二值图像。 4. **腐蚀操作**: `MatGrayDilate(const Matsrc, uchar kernel[3][3])` 这里定义了一个腐蚀操作,使用一个3x3的结构元素(kernel)对灰度图像进行腐蚀。腐蚀是一种图像处理技术,通过在原图像上应用一个模板(kernel),如果模板中心像素与原图像中的所有像素相等,则保留该中心像素,否则替换为邻域像素中的最小值。这有助于去除噪声并减小物体边缘的宽度。 5. **膨胀操作**: `MatGrayErode(const Matsrc, uchar kernel[3][3])` 类似于腐蚀,但膨胀是通过比较中心像素与邻域像素的最大值来实现的。膨胀会增加物体的边界,增强边缘细节。 这些函数展示了OpenCV库外的手动实现图像处理的基本步骤,特别是对于腐蚀和膨胀这样的基础形态学操作。它们可用于教学、研究或者作为更高级图像处理算法的预处理步骤。通过这种方式,开发者可以深入理解这些操作背后的原理,并根据需要进行自定义优化。
#ifndef _IMAGE_H_
#define _IMAGE_H_
#include <opencv.hpp>
using namespace cv;
//图像灰度处理
Mat RGB2GRAY(const Mat src);
//阈值
float Threshold(const Mat src);//输入参数为灰度图像
//图像二值化
Mat GRAYtoBinaryzation(const Mat src,float threshold);//src为灰度图像;threshold为阈值
//图像膨胀
Mat GrayDilate(const Mat src,uchar kernel[3][3]);
//图像腐蚀
Mat GrayErode(const Mat src,uchar kernel[3][3]);
#endif /*_IMAGE_H_*/
image.cpp
#include "image.h"
//灰度处理
Mat RGB2GRAY(const Mat src){
int PointR,PointG,PointB;//RGB图像的每个通道的数值
int PointGray;//灰度图像每个像素的值
dst = Mat::zeros(src.rows,src.cols,CV_8UC1);//创建一个和原图同样大小的单通道图像空间
for(int i=1;i<src.rows;i++){
for(int j=1;j<src.cols;j++){
PointB = src.at<Vec3b>(i,j)[0]; //获取原图像蓝色通道的灰度值
PointG = src.at<Vec3b>(i,j)[1]; //获取原图像绿色通道的灰度值
PointR = src.at<Vec3b>(i,j)[2]; //获取原图像红色通道的灰度值
//计算该像素点的灰度值
PointGray = PointR*0.299 + PointG*0.587 + PointB*0.114;
dst.at<uchar>(i,j) = PointGray; //为灰度空间内赋转换后的灰度值
}
}
return dst;
}
//阈值
float Threshold(const Mat src){
float threshold = 0;
for(int i=1;i<src.rows;i++){
for(int j=1;j<src.cols;j++){
threshold += src.at<uchar>(i,j); //计算所有像素的灰度之和
}
}
return (threshold/(src.rows*src.cols)); //返回灰度的平均值乘以
}
//二值化
Mat GRAYtoBinaryzation(const Mat src,float threshold){
Mat dst; //二值空间
dst = Mat::zeros(src.rows,src.cols,CV_8UC1);//创建一个和原图同样大小的单通道空间
剩余6页未读,继续阅读
- 粉丝: 206
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦