首页 > 其他分享 >OpenSeadragon 实战系列第三方插件

OpenSeadragon 实战系列第三方插件

时间:2023-05-11 15:22:50浏览次数:36  
标签:实战 function 插件 卷积 过滤 矩阵 OpenSeadragon num

序言

  在我们的项目中,一般不可能只是简单的显示图片,对应着还需要做一些图像标注、图像颜色过滤等操作,比如一些医学病理切片。所以openseadragon也为我们提供了一些插件,我们打开官网,找到plugins

  这些插件中有很多是中间件,各位根据自己的需求自行研究把,在我的项目中只使用到了OpenseadragonFiltering颜色过滤插件

OpenseadragonFiltering中间件
  在filtering的github中介绍了很多过滤颜色的插件,但是在我实际应用中,只有卷积(锐度)是好用的,所以我还引用了第三方的插件,稍候介绍,此处只介绍Filtering的卷积(锐度)如何使用。

  根据github使用说明,将openseadragon与filtering结合可以这样使用

1 viewer.setFilterOptions({
2     filters: {
3         processors: []
4     }
5 })

所以卷积应该放在processors里,即

1 viewer.setFilterOptions({
2     filters: {
3         processors: [
4             OpenSeadragon.Filters.CONVOLUTION(arr)
5         ]
6     }
7 })

  关于卷积矩阵的定义,建议大家百度一下。在这里大概说一下,卷积矩阵需要保证矩阵内所有数字相加得1,而且,矩阵必须为奇数,即3*3、5*5、7*7矩阵,具体使用哪种矩阵,根据你项目的需求而定。一般矩阵越大,卷积精度越高。在这里我是用的是最简单的3*3矩阵,直接上我的代码

 1 viewer.setFilterOptions({
 2     filters: {
 3         processors: [
 4             that.getConvolution()
 5         ]
 6     }
 7 })
 8  
 9 getConvolution:function(){
10 //矩阵规则,所有数相加得1;一般矩阵为3*3、5*5、7*7,只要保证为奇数即可,此处用最简单的3*3。
11     var num = parseInt(convolution.config.nowValue);//获取当前用户输入的卷积数值
12     var arr = [0,-num,0,-num,num*4+1,-num,0,-num,0]/不一定按照这种矩阵来,只要保证相加得1即可
13     return OpenSeadragon.Filters.CONVOLUTION(arr)
14 }

  当然可能还有些童鞋不明白卷积矩阵到底是啥,简单说明一下,在插件处理图像时,是按照像素来进行处理得,从(0,0)这个像素点一直处理到你图像的右下角,每处理一点,都会使用这个卷积矩阵。当前点即为矩阵中心点,用第一个点(0,0)举例,这点就对应着上边代码的(num*4+1)这个点,然后按照一定的规则结合你的矩阵,将这个点的四周像素点进行处理。如果你不是一个专业做图像,就不用管具体是怎么实现的,你只需要知道矩阵的一般规则即可,感兴趣还是建议去百度一下更为专业的解释。

  接下来我使用另一个插件来处理伽马、对比度、饱和度和三通道颜色。

caman.js
  如果各位看了filtering的github可以找到,这个插件也提供了结合caman.js使用的方法,使用方法如下

 1 viewer.setFilterOptions({
 2     filters: {
 3         processors: [
 4             function(context, callback) {
 5                 Caman(context.canvas, function() {
 6                     //这里放需要加入的图像处理
 7                     this.render(callback);
 8                 });
 9             }
10         ]
11     }
12 })

关于caman.js的使用,各位在官网可以找到,使用方法非常简单,这里就不再赘述了,关于filtering和caman两种不同的颜色过滤结合使用在filtering的github里也有介绍,我就直接贴上我项目中的完整过滤代码

 1 updateFilter:function(){
 2     Caman.Store.put = function() {};
 3     viewer.setFilterOptions({
 4         filters: {
 5             processors: [
 6                 //卷积(锐度)
 7                 that.getConvolution(),
 8                 function(context, callback) {
 9                     Caman(context.canvas, function() {
10                         //伽马
11                         this.gamma(用户输入的数值);
12                         //对比度
13                         this.contrast(用户输入的数值);
14                         //饱和度
15                         this.saturation(用户输入的数值);
16                         //三通道颜色
17                         this.channels({
18                             red: 用户输入的数值,
19                             green:用户输入的数值,
20                             blue:用户输入的数值
21                         });
22                         //必须render
23                         this.render(callback);
24                     });
25                 }
26             ]
27         }
28     })
29 },
30 getConvolution:function(){
31     //矩阵规则,所有数相加得1;一般矩阵为3*3、5*5、7*7,只要保证为奇数即可,此处用最简单的3*3。
32     var num = 用户输入的数值;
33     var arr = [0,-num,0,-num,num*4+1,-num,0,-num,0]
34     return OpenSeadragon.Filters.CONVOLUTION(arr)
35 }

  这里注意一点,所有的过滤必须给定一个默认的数值,因为中间件filtering的processors,如果你每次只设置一种过滤,那么之前设置的过滤将被清空,只绘制这一次的过滤,所以在我的项目中,图像被openseadragon打开后,我就调用了updateFilter这个方法,然后每次用户输入都将会调用updateFilter这个方法。

至此,颜色过滤就完成了。

结束
  openseadragon这个系列也是自己摸索了很长时间才完成到这个程度。实际项目中可能大家还会遇到画线、标注和测量的问题,因为各种js间点击事件的冲突,所以画线标注我一直没找到一个很好的解决方案,所以也就不放上来了。如果你也正在处理openseadragon 的项目,大家可以一起相互讨论,如果以后我找到了好的解决方案,我会再次更新这个系列。

标签:实战,function,插件,卷积,过滤,矩阵,OpenSeadragon,num
From: https://www.cnblogs.com/ybqjymy/p/17391132.html

相关文章

  • OpenSeadragon 实战系列dzi图像切割命名规则篇
    序言根据前边的两篇文章,我们已经可以实现图像的显示了。但是现在我们显示的还是由微软软件自动生成的图片,在实际运用中,需要由后端将图片切割,具体切割方式在微软的dzi图片格式说明中也有,地址:https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-wi......
  • STATA traj插件应用
    usehttps://www.andrew.cmu.edu/user/bjones/traj/data/panss.dta,cleargenoos=0replaceoos=rbinomial(1,.2)traj,var(p1-p6)indep(t1-t6)model(cnorm)min(-999)max(999)order(331)risk(risper)dropout(111)dcov(risperrisperrisp......
  • 模板元编程实战--TypeList算法--查找
    从一个类型列表中查找是否包含某一个类型。要从一个类型列表中查找,那么首先要获得每一个类型,然后与特定的类型比较,然后将结果保存起来。首先考虑一下Elem应该如何实现。Elem将会展开参数列表,然后处理,这里使用之前演示Fold高阶函数回调处理:template<TLIn,typenameT>clas......
  • 未配置appkey或配置错误,uniapp原生安卓插件开发
    开发安卓原生插件一、官方文档1.https://nativesupport.dcloud.net.cn/NativePlugin/course/android2.下载对应的SDK、工程文件二、生成uniapp的appkey1.配置配置好Androidstudio的环境:SDK、JDK2.导入项目3.HbuilderX中创建新的项目“plugin_demo”,同时当前创建项目的APP......
  • [系统性能优化实践]JVM进阶实战之监控工具(Prometheus)
    1Prometheus监控SpringCloudGateway1.1简述API网关作为应用服务与外部交互的入口,通过对API网关的监控,可以清晰的知道应用整体的请求量,以便根据不同的并发情况进行扩容处理。对API网关的监控也是相当必要的。通过Prometheus监控Gateway与监控普通Springboot项目几乎......
  • 使用mybatisplus分页插件,设置了每页容量和页数但还是获取的全部数据(已解决)
    注意观察mybatisplus的查询语句,分页插件正确配置后,在查询时会使用limit限制查询的数量(如下图) 但是如果没配置好就是没有limit这个限制,只要加上配置文件或者确认自己的配置正确即可,配置参考如下博客springboot(二)整合mybatisplus+分页插件+代码生成springboot(二)整合mybat......
  • Jmeter - dubbo插件测试dubbo接口
    转载:https://blog.csdn.net/baidu_28340727/article/details/125570560一、背景对于如何使用Jmeter测试http接口,大家都已经比较熟悉,网上相关的知识也很多。但随着微服务越来越流行,仅仅会测试http接口已经远远不够。Dubbo作为当下非常流行的RPC接口,学习如何测试Dubbo接口已经成为......
  • SpringSecurity实战(二)-基于数据库认证
    pom依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId&......
  • pg_enterprise_views偶然发现的PG神仙插件
    一直从事数据库相关的工作,对于PG而言最大的问题其实是在运维管理方面,其缺乏有效且直观成体系的系统表,苦觅良久,今日在PG官网中发现了一款新收录的免费插件,其提供了数十张系统表,内容涵盖了从操作系统到数据库的负载指标、等待事件、会话、客户端、SQL、SQL执行计划、超时锁、长......
  • 验证码插件的使用
    验证码插件captcha-mini的使用使用yarnaddcaptcha-mini命令安装插件yarnaddcaptcha-minijs中引入验证码插件//引入验证码插件letCaptcha=require('captcha-mini')验证码实例化//1:验证码实例化letcaptcha1=newCaptcha({lineWidth:1......