自学opencv日记,day6
形态学操作应用-提取水平与垂直线原理方法图像形态学操作时候可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 –膨胀与腐蚀使用不同的结构元素实现对输入图像的操作、得到想要的结果。膨胀输出的像素值是结构元素覆盖下输入图像的最大像素值腐蚀输出的像素值是结构元素覆盖下输入图像的最小像素值代码#include opencv2/opencv.hpp #include iostream using namespace cv; int main(int argc, char** argv) { Mat src imread(C:/Users/Administrator/Pictures/hello.png); if (src.empty()) { printf(不能加载图像); return -1; } namedWindow(创建成功, CV_WINDOW_AUTOSIZE); imshow(创建成功, src); Mat gray; cvtColor(src, gray, CV_BGR2GRAY); namedWindow(gray image, 1); imshow(gray image, gray); Mat binImg; adaptiveThreshold(~gray, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); imshow(binary image, binImg); waitKey(0); return 0; }图1-1 原图像灰度图像与二值图像其中代码参数Mat hline getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));//水平结构元素 Mat vline getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));//竖直结构元素 Mat dst; Mat temp; erode(binImg, temp, hline); dilate(temp, dst, hline); bitwise_not(dst, dst); imshow(Final Result, dst);开操作后提取水平线图1-2 提取水平线开操作后提取竖直线:图1-3 提取竖直线开操作也可以用这一句morphologyEx(binImg, dst, CV_MOP_OPEN, vline);bitwise_not(dst, dst);这一句是颜色反转。应用提取验证码图1-4 效果图注意图片名称最好不要是中文。图像金字塔上采样和降采样#include opencv2/opencv.hpp #include iostream using namespace cv; int main(int argc, char** argv) { Mat src imread(C:/Users/Administrator/Pictures/20160711084909.jpg); if (src.empty()) { printf(不能加载图像); return -1; } namedWindow(input image, CV_WINDOW_AUTOSIZE); imshow(input image, src); Mat dst, dstdown; pyrUp(src, dst, Size(src.cols * 2, src.rows * 2)); imshow(output image, dst); pyrDown(src, dstdown, Size(src.cols / 2, src.rows / 2)); imshow(output2 image, dstdown); waitKey(0); return 0; }图1-5 上采样和降采样高斯不同DOGDifference Of GaussianMat gray, g1, g2, dogImg; cvtColor(src, gray, CV_BGR2GRAY); GaussianBlur(gray, g1, Size(3, 3), 0, 0); GaussianBlur(g1, g2, Size(3, 3), 0, 0); subtract(g1, g2, dogImg, Mat()); imshow(dogImg, dogImg); waitKey(0); return 0; }此时可以看到一点微弱的轮廓是因为图像变化后不明显。图1-6 不明显的高斯不同图此时加入normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);将图像在0-255的地方归一化如图所示图1-7 归一化后的高斯不同图完整代码如下#include opencv2/opencv.hpp #include iostream using namespace cv; int main(int argc, char** argv) { Mat src imread(C:/Users/Administrator/Pictures/20160711084909.jpg); if (src.empty()) { printf(不能加载图像); return -1; } namedWindow(input image, CV_WINDOW_AUTOSIZE); imshow(input image, src); Mat dst, dstdown; //上采样 pyrUp(src, dst, Size(src.cols * 2, src.rows * 2)); imshow(output image, dst); //降采用 pyrDown(src, dstdown, Size(src.cols / 2, src.rows / 2)); imshow(output2 image, dstdown); //DOG Mat gray, g1, g2, dogImg; cvtColor(src, gray, CV_BGR2GRAY); GaussianBlur(gray, g1, Size(5, 5), 0, 0); GaussianBlur(g1, g2, Size(5, 5), 0, 0); subtract(g1, g2, dogImg, Mat()); //归一化显示 normalize(dogImg, dogImg, 255, 0, NORM_MINMAX); imshow(dogImg, dogImg); waitKey(0); return 0; }基本阈值操作分割类型超过阈值的就和阈值取相等。小于阈值的取0.大于阈值取0.寻找阈值的方法二值化阈值代码#include opencv2/opencv.hpp #include iostream using namespace cv; int threshold_value 127; int threshold_max 255; Mat src, dst; const char* output_title binary image; void Threshold_Demo(int, void*); int main(int argc, char** argv) { src imread(C:/Users/Administrator/Pictures/20160711084909.jpg); if (src.empty()) { printf(不能加载图像); return -1; } namedWindow(input image, CV_WINDOW_AUTOSIZE); namedWindow(output_title, CV_WINDOW_AUTOSIZE); imshow(input image, src); createTrackbar(Threshold Value, output_title, threshold_value, threshold_max, Threshold_Demo); Threshold_Demo(0, 0); waitKey(0); return 0; } void Threshold_Demo(int, void*) { Mat gray; cvtColor(src, gray, CV_BGR2GRAY); threshold(gray, dst, threshold_value, threshold_max, THRESH_BINARY);//二值化阈值 imshow(output_title, dst); }图1-8 二值化阈值注意如果需要生成动态调节结构元素的控制条必须要先创建namedwindow这个窗口如果直接imshow是不会生成控制条的。反向二值化阈值threshold(gray, dst, threshold_value, threshold_max, THRESH_BINARY_INV);图1-9 反向二值化阈值这五种操作可以新建一个trackbar统一起来用type_value来代表五种不同的操作。效果如下图1-10 五种操作集合代码#include opencv2/opencv.hpp #include iostream using namespace cv; int threshold_value 127; int threshold_max 255; int type_value 2; int type_max 4; Mat src, dst; const char* output_title binary image; void Threshold_Demo(int, void*); int main(int argc, char** argv) { src imread(C:/Users/Administrator/Pictures/20160711084909.jpg); if (src.empty()) { printf(不能加载图像); return -1; } namedWindow(input image, CV_WINDOW_AUTOSIZE); namedWindow(output_title, CV_WINDOW_AUTOSIZE); imshow(input image, src); createTrackbar(Threshold Value, output_title, threshold_value, threshold_max, Threshold_Demo); createTrackbar(Type Value, output_title, type_value, type_max, Threshold_Demo);//这个trackbar可以改变type_value的值 Threshold_Demo(0, 0); waitKey(0); return 0; } void Threshold_Demo(int, void*) { Mat gray; cvtColor(src, gray, CV_BGR2GRAY); //threshold(gray, dst, threshold_value, threshold_max, THRESH_BINARY);//二值化阈值 //threshold(gray, dst, threshold_value, threshold_max, THRESH_BINARY_INV);//反向二值化阈值 threshold(gray, dst, threshold_value, threshold_max, type_value); imshow(output_title, dst); }threshold(gray, dst, 0, 255,THRESH_OTSU | type_value);//自动计算阈值或者threshold(gray, dst, 0, 255, THRESH_TRIANGLE | type_value);//自动计算阈值直方这个操作可以自动计算阈值将原代码中 threshold(gray, dst, threshold_value, threshold_max, type_value);替换即可。PS:灰度图像才能进行阈值操作。

相关新闻

戴尔G15散热控制终极指南:免费开源工具告别AWCC卡顿烦恼

戴尔G15散热控制终极指南:免费开源工具告别AWCC卡顿烦恼

戴尔G15散热控制终极指南:免费开源工具告别AWCC卡顿烦恼 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为戴尔G15笔记本的散热问题烦恼吗&…

2026/11/3 4:18:38 阅读更多 →
LeetCode——110,判断平衡二叉树

LeetCode——110,判断平衡二叉树

/*** \* Created: liuhuichao* \* Date: 2019/8/29* \* Time: 30:09 PM* \* Description: 判断平衡二叉树* \* 给定一个二叉树,判断它是否是高度平衡的二叉树。* <p>* 本题中,一棵高度平衡二叉树定义为:* <p>* 一个二叉树每个节点 的左右两个子树的高度差的绝对…

2026/11/3 4:17:23 阅读更多 →
MyBatis流式查询实战:解决海量数据查询内存溢出问题

MyBatis流式查询实战:解决海量数据查询内存溢出问题

这次我们来看一个 Java 开发中非常实际的问题&#xff1a;如何用 MyBatis 的流式查询&#xff0c;解决一次性加载海量数据导致的内存溢出&#xff08;OOM&#xff09;。很多开发者都遇到过&#xff0c;一个看似简单的SELECT * FROM large_table&#xff0c;在数据量达到百万级时…

2026/11/3 0:45:43 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻