2019-01-27 11:25:26 qq_27131611 阅读数 419

基于Qt Creator 的Windows下数字图像处理软件[栏目]

前言

之前说准备转行软件开发,准备从C++的学习开始,恰好这学期的数字图像处理需要做一个项目,所以决定用QT C++来完成此次的项目设计,由于前期时间关系,没有及时更新,现在项目基本完成,准备写一个栏目的文章来与和我一样自学的小白分享一些Qt Creator、C++的知识,对这个项目进行总结的同时也希望能让看到这个栏目博客的朋友少走一些弯路。
在后面的项目介绍中会对使用到的一些控件以及C++语法做详细的解释,同时同步更新相对应的完整工程文件。

设计过程

设计过程在后面连载的博客中按逻辑功能讲解,下一篇:Qt C++:综合数字图像处理平台–登录界面设计。
请期待…

完整项目展示

经过大半个学期的努力,现学现用,总算撸出来了一个相对完善的综合数字图像处理平台(至于为什么是教学模块,后面再说),界面设计耗费很多精力,毕竟小白,对控件使用不熟悉。
话不多说,直接上图。

2019-04-28 09:35:28 jfbh_0 阅读数 160

WPF控件模版TreeView

  1. 整个Demo效果图。
    在这里插入图片描述

  2. 前言
    最近准备接触图像处理领域的东西,想想还是从opencv开始学习,看到模板匹配的时候忍不住想动手实现之间接触的一个项目,因某些原因图像的来源是从CSharp程序里实现的,所以得转到C++里面调用opencv处理,但是到选取模板区域有点麻烦了,wpf自带的image控件并不支持选区的编辑,而且还有坐标、RGB等重要信息输出,就动手Do It!

  3. 感谢
    首先这里参阅了好多大神的例子,包括这个主界面(论坛大神用纯C/C++实现基础的图像处理功能,简直是我等楷模!),站在别人的肩膀上果然不腰疼。。。

  4. 正题
    框架介绍下,左边是TreeViee控件,反射的自己磁盘目录文件,如果是文件的话只区分两种,图片文件和非图片文件,本软件仅处理图像文件(bmp、jpg、png);右边为图像控件,能实现鼠标操作,缩放、拖动、实时显示位置和RGB、局部放大、选取编辑(仅以三种形状Demo)等功能。

    • TreeView控件
      添加节点选中的属性,对外通知选中的文件路径(参阅)。
class MyTreeView : TreeView
    {
        public MyTreeView() : base()
        {
            this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH);
        }

        void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (SelectedItem != null)
            {
                //将SelectedItem通知到SelectedItem_Property也就是代理属性SelectedItem_,以便往外传播
                SetValue(SelectedItem_Property, SelectedItem);
            }
        }

        public object SelectedItem_
        {
            get { return (object)GetValue(SelectedItem_Property); }
            set { SetValue(SelectedItem_Property, value); }
        }
        public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(MyTreeView), new UIPropertyMetadata(null));
    }

在设计节点时,设计属性当前目录所有元素信息:路径、元素名称、元素图标、下一层路径元素列表

  class BindDirectory
    {
        static readonly string[] Imageforamt = new[] { ".bmp", ".jpg", ".png" };
        private List<BindDirectory> _directories;
        public string Name { get; private set; }
        public string Path { get; private set; }
        public ImageSource Icon { get; private set; }
        public BindDirectory(string directoryPath)
        {
            //正规化目录路径,确保Path以'\\'结尾
            directoryPath = directoryPath.TrimEnd('\\');
            Path = directoryPath + '\\';
            int indexLastSlash = directoryPath.LastIndexOf('\\');//计算出目录名称(不包含路径)
            Name = indexLastSlash >= 0 ? directoryPath.Substring(indexLastSlash + 1) : directoryPath;
            Icon = new BitmapImage(new Uri("pack://application:,,,/images/Floder.png"));
        }
        public BindDirectory(FileInfo info)
        {
            Name = info.Name;
            Path = info.FullName;
            if (Imageforamt.Contains(info.Extension.ToLower()))
                Icon = new BitmapImage(new Uri("pack://application:,,,/images/image.png"));
            else
                Icon = new BitmapImage(new Uri("pack://application:,,,/images/file.png"));
        }

        public IEnumerable<BindDirectory> Directories
        {
            get
            {
                if (_directories == null) //延迟加载
                {
                    _directories = new List<BindDirectory>();
                    foreach (string d in Directory.GetDirectories(Path))
                        _directories.Add(new BindDirectory(d));
                    foreach (var f in Directory.GetFiles(Path))
                        _directories.Add(new BindDirectory(new FileInfo(f)));
                }
                return _directories;
            }
        }
        public static bool ValidImageFile(string path)
        {
            return Imageforamt.Contains(new FileInfo(path).Extension.ToLower());
        }
        public override string ToString()
        {
            return Path;
        }
    }
    
这里要注意的是当选择某一目录(鼠标选中)时,需要读出该路径下层元素信息,第一层由磁盘管理器读取各个磁盘信息。
foreach (var drive in DriveInfo.GetDrives())
            {
                Add(new BindDirectory(drive.RootDirectory.FullName));
            }

然后设计TreeViewItem的样式,每一层需要三个元素,左边图标折叠展开,右边元素图标(文件、文件夹),元素名称,网上摘录了一个第三方的Style

 <Style  x:Key="DefaultTreeViewItem" TargetType="{x:Type TreeViewItem}">
           <Setter Property="MinHeight" Value="25" />
           <Setter Property="Foreground" Value="Black" />
           <Setter Property="Background" Value="Transparent" />
           <Setter Property="SnapsToDevicePixels" Value="True" />
           <Setter Property="Margin" Value="0" />
           <Setter Property="Template">
               <Setter.Value>
                   <ControlTemplate TargetType="{x:Type TreeViewItem}">
                       <StackPanel>
                           <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
                               BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"
                               MinHeight="{TemplateBinding MinHeight}" UseLayoutRounding="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                               <!--多层级间隔,暂缓-->
                               <!--<Grid Margin="{Binding Converter={StaticResource LengthConverter}, RelativeSource={x:Static RelativeSource.TemplatedParent}}"-->
                               <Grid Margin="{TemplateBinding Margin}" VerticalAlignment="Stretch">
                                   <Grid.ColumnDefinitions>
                                       <ColumnDefinition MinWidth="18" Width="Auto" />
                                       <ColumnDefinition Width="*" />
                                   </Grid.ColumnDefinitions>
                                   <!--展开收缩按钮-->
                                   <ToggleButton x:Name="ExpanderBtn" 
                                             IsChecked="{Binding Path=IsExpanded, RelativeSource={x:Static RelativeSource.TemplatedParent}, Mode=TwoWay}"
                                             ClickMode="Press" >
                                       <ToggleButton.Template>
                                           <ControlTemplate TargetType="ToggleButton">
                                               <Border>
                                                   <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                               </Border>
                                           </ControlTemplate>
                                       </ToggleButton.Template>
                                       <ToggleButton.Content>
                                           <Image x:Name="ExpanderIcon"/>
                                           <!--<TextBlock x:Name="ExpanderIcon"  Foreground="{TemplateBinding Foreground}" Text="&#xe62c;"  Style="{StaticResource FIcon}" />-->
                                       </ToggleButton.Content>
                                   </ToggleButton>
                                   <!--内容-->
                                   <ContentPresenter x:Name="PART_Header" Grid.Column="1" ContentSource="Header"
                                                 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                 VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                               </Grid>
                           </Border>
                           <ItemsPresenter Margin="18,0,0,0" x:Name="ItemsHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                       </StackPanel>
                       <ControlTemplate.Triggers>
                           <Trigger Property="IsExpanded" Value="False">
                               <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed" />
                               <Setter TargetName="ExpanderIcon" Property="Source" Value="pack://application:,,,/images/expand-right.png" />
                           </Trigger>
                           <Trigger Property="IsExpanded" Value="True">
                               <Setter TargetName="ExpanderIcon" Property="Source" Value="pack://application:,,,/images/expand-down.png" />
                           </Trigger>
                           <Trigger Property="HasItems" Value="False">
                               <Setter TargetName="ExpanderIcon" Property="Visibility" Value="Hidden" />
                           </Trigger>
                           <Trigger Property="IsMouseOver" Value="True">
                               <Setter Property="Background" Value="{StaticResource ItemMouseOverBackground}" />
                               <Setter Property="Foreground" Value="{StaticResource ItemMouseOverForeground}" />
                           </Trigger>
                           <Trigger Property="IsSelected" Value="True">
                               <Setter Property="Background" Value="{StaticResource ItemSelectedBackground}" />
                               <Setter Property="Foreground" Value="{StaticResource ItemSelectedForeground}" />
                           </Trigger>
                           <MultiTrigger>
                               <MultiTrigger.Conditions>
                                   <Condition Property="IsSelected" Value="True" />
                                   <Condition Property="Selector.IsSelectionActive" Value="True" />
                               </MultiTrigger.Conditions>
                               <Setter Property="Background" Value="{StaticResource ItemSelectedBackground}" />
                               <Setter Property="Foreground" Value="{StaticResource ItemSelectedForeground}" />
                           </MultiTrigger>
                       </ControlTemplate.Triggers>
                   </ControlTemplate>
               </Setter.Value>
           </Setter>
       </Style>

关于模板的概念参阅
1.https://www.cnblogs.com/zhili/p/WPFTemplate.html; 2.https://www.cnblogs.com/dingli/archive/2011/07/20/2112150.html#top;
ToggleButton 控件模板决定了Content展开收缩的外观均为居中,Content为一个Image控件来显示展开收缩的图标,图标切换的逻辑放模板触发器内;第二列为元素名称,使用ContentPresenter显示当前元素内容,ItemsPresenter显示子元素内容。在这里插入图片描述
小结(本文主要内容为加深对WPF模版控件的理解):
1.使用HierarchicalDataTemplate继承与DataTemplate作为TreeViewItem和MenuItem的主要数据模板,这里设计显示当前目录的名称和图标;
2.使用ObjectDataProvider实现在xaml中实例化数据源,并可接受实例的方法、属性等数据绑定,这里利用构造函数将数据源(磁盘的集合)绑定到ItemSource;
在这里插入图片描述

  • 未完待续。。。
2013-12-09 16:49:22 u011795147 阅读数 1977

Image Processor for iOS 是基于图像处理开发包LEADTOOLS Imaging Pro的LEADTOOLS iOS库开发而成的图像处理软件,用于iOS设备上媒体库或照片的图像处理,如裁剪,旋转,文档清理,医学图像增强,色彩转换和校正,图像降噪和边缘检测等,为你带来专业而便捷的图像处理体验。

提示:本案例提供完整的源代码和新手入门文档,方便开发人员了解LEADTOOLS iOS使用方法,从而快速上手:>>>下载源代码和入门文档

功能及效果展示


一、本地图像或者拍照

软件选取照片时既支持现拍照片,也支持从相册中选取一张照片,照片中可以用方框来选择需要的照片部分,选取后可调整大小、角度。

二、图像格式

加载,转换和保存超过150种行业标准和专有图像格式,如 PDF,PDF/A,JPEG, JPEG 2000, TIFF,DWG,DXF和DCM等。

LEADTOOLS典型案例-iOS图像处理软件(附源码)    LEADTOOLS典型案例-iOS图像处理软件(附源码)

三、图像处理

拥有超过200种先进的图像处理功能,如裁剪,旋转,文档清理,滤镜处理医学图像增强,色彩转换和校正,图像降噪和边缘检测等。

LEADTOOLS典型案例-iOS图像处理软件(附源码)    LEADTOOLS典型案例-iOS图像处理软件(附源码)    LEADTOOLS典型案例-iOS图像处理软件(附源码)

四、注释和标记

全面的图像注释和标记功能,包括几何形状,便签贴,编校,高亮和橡皮图章,既适用于普通图像的标记,也适用于一些特殊文档或者医学图像的标记。

五、条形码支持

检测并读写图像中的一维及二维条码,如QR, PDF417, Data Matrix, UPC/EAN 等。

六、文档识别

从图像文档中提取文本,并将图像转换成可搜索的文本格式,如PDF,PDF/ A,DOC,DOCX,XML,XPS等。

七、DICOM支持

加载、查看、处理和保存DICOM图像。

系统要求


  • 与iPhone 3GS、iPhone 4 iPhone 4S、iPhone 5、iPod、iPod touch( 第3代)、iPod touch( 第4代)、iPod touch( 第5代)和iPad 兼容;
  • 需要iOS 4.3或更高版本;
  • 已针对 iPhone 5 进行优化。



2019-08-27 11:19:30 xiyangxiaoguo 阅读数 36

软件开启界面:

包含菜单、快捷、新建图像子窗口

文件 已实现功能 :新建、打开、关闭、保存、另存为

打开 可以打开jpg, png,txt或者自己添加其他格式的图像(可使用opencv打开图像的功能,或者自己编写打开各种文件的方法)

 

实现了滚动条浏览大图像

图像处理 通过添加opencv处理图像的一些功能,比如掩模,转灰度,缩放图像,各种滤波等等,或者自己实现各种功能

 

 

缩放图像 通过输入调整比例进行调整,可限制长宽比

掩模(锐化边缘)

打开多个文档

总结:利用opencv结合MFC多文档视图实现了基本的具有图像处理功能的软件框架,可以在其基础上继续添加其他图像处理功能,订制特定功能的图像处理软件。

源码获取wx: 18211165078

 

2014-03-25 11:36:35 C_Bright 阅读数 4094

Python图像处理库:

一:PIL

PythonWare公司提供了免费的图像处理工具包 PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发。

在PIL中,任何一副图像都是用一个Image对象表示,而这个类由和它同名的模块导出,因此,要加载一副图像,最简单的形式是这样的:

import Image
img = Image.open(“dip.jpg”)

注意:第一行的Image是模块名;第二行的img是一个Image对象; Image类是在Image模块中定义的。关于Image模块和Image类,切记不要混淆了。现在,我们就可以对img进行各种操作了,所有对img的 操作最终都会反映到到dip.img图像上。

项目主页:http://www.open-open.com/lib/view/home/1329487881203

二:Pillow

Pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。

Pillow 为了解决 PIL 的两个问题:

1. 不兼容 setuptools 
2. 报告的问题太多,而更新太慢 

项目主页:http://www.open-open.com/lib/view/home/1376959572788

三:Mahotas

Mahotas 是一个 Python 的图像处理库,包含大量的图像处理算法,使用 C++ 实现的算法,处理性能相当好。

目主页:http://www.open-open.com/lib/view/home/1329050076921

四:Pymorph

Pymorph 包含一组纯 Python 实现的图像形态处理函数,例如 erode, dilate, open, tophat opening, and watershed。

项目主页:http://www.open-open.com/lib/view/home/1329487525890


遥感图像处理

阅读数 930

没有更多推荐了,返回首页