opencv实现分水岭,金字塔,均值漂移算法进行分割
更新时间:2024-04-17 00:14:01 阅读量: 综合文库 文档下载
- opencv 金字塔推荐度:
- 相关推荐
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;
using System.Windows.Forms; using System.Diagnostics;
using System.Runtime.InteropServices; using Emgu.CV;
using Emgu.CV.CvEnum; using Emgu.CV.Structure; using Emgu.CV.UI;
namespace ImageProcessLearn
{
public partial class FormImageSegment : Form {
//成员变量
private string sourceImageFileName = \;//源图像文件名 private Image
private Image
private double xScale = 1d; //原始图像与PictureBox在x轴方向上的缩放
private double yScale = 1d; //原始图像与PictureBox在y轴方向上的缩放
private Point previousMouseLocation = new Point(-1, -1); //上次绘制线条时,鼠标所处的位置 private const int LineWidth = 5; //绘制线条的宽度
private int drawCount = 1; //用户绘制的线条数目,用于指定线条的颜色
public FormImageSegment() {
InitializeComponent(); }
//窗体加载时
private void FormImageSegment_Load(object sender, EventArgs e) {
//设置提示
toolTip.SetToolTip(rbWatershed, \可以在源图像上用鼠标绘制大致分割区域线条,该线条用于分水岭算法\);
toolTip.SetToolTip(txtPSLevel, \金字塔层数跟图像尺寸有关,该值只能是图像尺寸被2整除的次数,否则将得出错误结果\);
toolTip.SetToolTip(txtPSThreshold1, \建立连接的错误阀值\);
toolTip.SetToolTip(txtPSThreshold2, \分割簇的错误阀值\);
toolTip.SetToolTip(txtPMSFSpatialRadius, \空间窗的半径\); toolTip.SetToolTip(txtPMSFColorRadius, \色彩窗的半径\);
toolTip.SetToolTip(btnClearMarkers, \清除绘制在源图像上,用于分水岭算法的大致分割区域线条\); //加载图像 LoadImage(); }
//当窗体关闭时,释放资源
private void FormImageSegment_FormClosing(object sender, FormClosingEventArgs e) {
if (imageSource != null) imageSource.Dispose();
if (imageSourceClone != null) imageSourceClone.Dispose(); if (imageMarkers != null) imageMarkers.Dispose(); }
//加载源图像
private void btnLoadImage_Click(object sender, EventArgs e) {
OpenFileDialog ofd = new OpenFileDialog(); ofd.CheckFileExists = true; ofd.DefaultExt = \;
ofd.Filter = \图片文件|*.jpg;*.png;*.bmp|所有文件|*.*\; if (ofd.ShowDialog(this) == DialogResult.OK) {
if (ofd.FileName != \) {
sourceImageFileName = ofd.FileName; LoadImage(); } }
ofd.Dispose(); }
//清除分割线条
private void btnClearMarkers_Click(object sender, EventArgs e) {
if (imageSourceClone != null)
imageSourceClone.Dispose();
imageSourceClone = imageSource.Copy(); pbSource.Image = imageSourceClone.Bitmap;
imageMarkers.SetZero();
drawCount = 1; }
//当鼠标按下并在源图像上移动时,在源图像上绘制分割线条
private void pbSource_MouseMove(object sender, MouseEventArgs e) {
//如果按下了左键
if (e.Button == MouseButtons.Left) {
if (previousMouseLocation.X >= 0 && previousMouseLocation.Y >= 0) {
Point p1 = new Point((int)(previousMouseLocation.X (int)(previousMouseLocation.Y * yScale));
*
xScale),
Point p2 = new Point((int)(e.Location.X * xScale), (int)(e.Location.Y * yScale)); LineSegment2D ls = new LineSegment2D(p1, p2);
int thickness = (int)(LineWidth * xScale);
imageSourceClone.Draw(ls, new Bgr(255d, 255d, 255d), thickness); pbSource.Image = imageSourceClone.Bitmap;
imageMarkers.Draw(ls, new Gray(drawCount), thickness); }
previousMouseLocation = e.Location; } }
//当松开鼠标左键时,将绘图的前一位置设置为(-1,-1)
private void pbSource_MouseUp(object sender, MouseEventArgs e) {
previousMouseLocation = new Point(-1, -1); drawCount++; }
//加载源图像
private void LoadImage() {
if (imageSource != null) imageSource.Dispose();
imageSource = new Image
imageSourceClone.Dispose();
imageSourceClone = imageSource.Copy(); pbSource.Image = imageSourceClone.Bitmap; if (imageMarkers != null) imageMarkers.Dispose();
imageMarkers = new Image
xScale = 1d * imageSource.Width / pbSource.Width; yScale = 1d * imageSource.Height / pbSource.Height; drawCount = 1; }
//分割图像
private void btnImageSegment_Click(object sender, EventArgs e) {
if (rbWatershed.Checked)
txtResult.Text += Watershed(); else if (rbPrySegmentation.Checked)
txtResult.Text += PrySegmentation(); else if (rbPryMeanShiftFiltering.Checked)
txtResult.Text += PryMeanShiftFiltering(); }
///
///
//分水岭算法分割
Image
sw.Start();
CvInvoke.cvWatershed(imageSource.Ptr, imageMarkers2.Ptr); sw.Stop();
//将分割的结果转换到256级灰度图像
pbResult.Image = imageMarkers2.Bitmap;
imageMarkers2.Dispose();
return string.Format(\分水岭图像分割,用时:sw.Elapsed.TotalMilliseconds); }
///
///
///
private string PrySegmentation() {
//准备参数
毫秒。\\r\\n\, {0:F05} Image
int level = int.Parse(txtPSLevel.Text);
double threshold1 = double.Parse(txtPSThreshold1.Text); double threshold2 = double.Parse(txtPSThreshold2.Text); //金字塔分割
Stopwatch sw = new Stopwatch(); sw.Start();
level, threshold1, threshold2); sw.Stop();
//显示结果
pbResult.Image = imageDest.Bitmap; //释放资源
imageDest.Dispose();
CvInvoke.cvPyrSegmentation(imageSource.Ptr, imageDest.Ptr, storage.Ptr, out ptrComp,
storage.Dispose(); return string.Format(\金字塔分割,用时:{0:F05}毫秒。\\r\\n\, sw.Elapsed.TotalMilliseconds); }
///
/// 均值漂移分割算法 ///
///
private string PryMeanShiftFiltering() {
//准备参数
Image
double epsilon = double.Parse(txtPMSFEpsilon.Text);
MCvTermCriteria termcrit = new MCvTermCriteria(maxIter, epsilon); //均值漂移分割
Stopwatch sw = new Stopwatch(); sw.Start();
OpenCvInvoke.cvPyrMeanShiftFiltering(imageSource.Ptr, imageDest.Ptr, spatialRadius, colorRadius, maxLevel, termcrit); sw.Stop(); //显示结果
pbResult.Image = imageDest.Bitmap; //释放资源
imageDest.Dispose();
return string.Format(\均sw.Elapsed.TotalMilliseconds); }
///
值漂移分割,用时:{0:F05}毫秒。\\r\\n\,
/// 当改变金字塔分割的参数“金字塔层数”时,对参数进行校验 ///
///
private void txtPSLevel_TextChanged(object sender, EventArgs e) {
int level = int.Parse(txtPSLevel.Text);
if (level < 1 || imageSource.Width % (int)(Math.Pow(2, level - 1)) != 0 || imageSource.Height % (int)(Math.Pow(2, level - 1)) != 0)
MessageBox.Show(this, \注意:您输入的金字塔层数不符合要求,计算结果可能会无效。\, \金字塔层数错误\);
}
///
/// 当改变均值漂移分割的参数“金字塔层数”时,对参数进行校验 ///
///
private void txtPMSFNaxLevel_TextChanged(object sender, EventArgs e) {
int maxLevel = int.Parse(txtPMSFNaxLevel.Text); if (maxLevel < 0 || maxLevel > 8)
MessageBox.Show(this, \注意:均值漂移分割的金字塔层数只能在0至8之间。\, \金字塔层数错误\);
} } }
return string.Format(\均sw.Elapsed.TotalMilliseconds); }
///
值漂移分割,用时:{0:F05}毫秒。\\r\\n\,
/// 当改变金字塔分割的参数“金字塔层数”时,对参数进行校验 ///
///
private void txtPSLevel_TextChanged(object sender, EventArgs e) {
int level = int.Parse(txtPSLevel.Text);
if (level < 1 || imageSource.Width % (int)(Math.Pow(2, level - 1)) != 0 || imageSource.Height % (int)(Math.Pow(2, level - 1)) != 0)
MessageBox.Show(this, \注意:您输入的金字塔层数不符合要求,计算结果可能会无效。\, \金字塔层数错误\);
}
///
/// 当改变均值漂移分割的参数“金字塔层数”时,对参数进行校验 ///
///
private void txtPMSFNaxLevel_TextChanged(object sender, EventArgs e) {
int maxLevel = int.Parse(txtPMSFNaxLevel.Text); if (maxLevel < 0 || maxLevel > 8)
MessageBox.Show(this, \注意:均值漂移分割的金字塔层数只能在0至8之间。\, \金字塔层数错误\);
} } }
正在阅读:
opencv实现分水岭,金字塔,均值漂移算法进行分割04-17
考研概率论复习古典概型中几种研究模型01-31
上海市静安区2009学年第二学期期末教学质量检测高一年级数学试卷05-25
第二章 地下爆破工程01-22
有你陪我真好作文600字07-05
贝索斯:不追求短期利润 手机属考虑范围01-18
审计中常用的Excel函数运用整理03-01
发改委疫情防控工作情况报告02-25
归园田居其三教案07-29
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 均值
- 分水岭
- 漂移
- 金字塔
- 算法
- 分割
- 实现
- 进行
- opencv
- 东北方言特点
- 2015电子测量实验指导书 - 图文
- 行政执法岗位资格认证考试题库
- 广州图书馆读者证申请表(邮寄办理)
- line6 hd500箱头模拟原型
- 英语四十八个音素发音图解口形及发音方法
- 高中生物第三章基因的本质第1节DNA是主要的遗传物质导学案新人教
- HSE管理方案 - 图文
- 关于会计工作计划范文-精选word文档(4页)
- 安全稽核员管理规定
- 例谈对教材的解读与重构
- 征占用林地补偿费等标准的批复-黑价联字27号
- 2018-2024年中国地铁广告市场深度评估及投资战略研究报告(目录
- 雨污水管道施工方案 - 图文
- 津电建计划〔2013〕12号附件3:建设工程施工专业分包模板(2013
- 解决问题(二)教学设计
- WB-自己总结
- 佛教词汇大全
- 中国磁扣式经理包行业发展研究报告 - 图文
- 大学生创新创业基础考试答案(时代英杰)