用java实现基于纹理的图像检索(灰度共生矩阵)

Python015

用java实现基于纹理的图像检索(灰度共生矩阵),第1张

%**************************************************************************

% 图像检索——纹理特征

%基于共生矩阵纹理特征提取,d=1,θ=0°,45°,90°,135°共四个矩阵

%所用图像灰度级均为256

%参考《基于颜色空间和纹理特征的图像检索》

%function : T=Texture(Image)

%Image: 输入图像数据

%T: 返回八维纹理特征行向量

%**************************************************************************

% function T = Texture(Image)

Gray = imread('d:\result5.bmp')

[M,N,O] = size(Gray)

M = 128

N = 128

%--------------------------------------------------------------------------

%1.将各颜色分量转化为灰度

%--------------------------------------------------------------------------

% Gray = double(0.3*Image(:,:,1)+0.59*Image(:,:,2)+0.11*Image(:,:,3))

%--------------------------------------------------------------------------

%2.为了减少计算量,对原始图像灰度级压缩,将Gray量化成16级

%--------------------------------------------------------------------------

for i = 1:M

for j = 1:N

for n = 1:256/16

if (n-1)*16<=Gray(i,j)&Gray(i,j)<=(n-1)*16+15

Gray(i,j) = n-1

end

end

end

end

%--------------------------------------------------------------------------

%3.计算四个共生矩阵P,取距离为1,角度分别为0,45,90,135

%--------------------------------------------------------------------------

P = zeros(16,16,4)

for m = 1:16

for n = 1:16

for i = 1:M

for j = 1:N

if j<N&Gray(i,j)==m-1&Gray(i,j+1)==n-1

P(m,n,1) = P(m,n,1)+1

P(n,m,1) = P(m,n,1)

end

if i>1&j<N&Gray(i,j)==m-1&Gray(i-1,j+1)==n-1

P(m,n,2) = P(m,n,2)+1

P(n,m,2) = P(m,n,2)

end

if i<M&Gray(i,j)==m-1&Gray(i+1,j)==n-1

P(m,n,3) = P(m,n,3)+1

P(n,m,3) = P(m,n,3)

end

if i<M&j<N&Gray(i,j)==m-1&Gray(i+1,j+1)==n-1

P(m,n,4) = P(m,n,4)+1

P(n,m,4) = P(m,n,4)

end

end

end

if m==n

P(m,n,:) = P(m,n,:)*2

end

end

end

%%---------------------------------------------------------

% 对共生矩阵归一化

%%---------------------------------------------------------

for n = 1:4

P(:,:,n) = P(:,:,n)/sum(sum(P(:,:,n)))

end

%--------------------------------------------------------------------------

%4.对共生矩阵计算能量、熵、惯性矩、相关4个纹理参数

%--------------------------------------------------------------------------

H = zeros(1,4)

I = H

Ux = H Uy = H

deltaX= H deltaY = H

C =H

for n = 1:4

E(n) = sum(sum(P(:,:,n).^2))%%能量

for i = 1:16

for j = 1:16

if P(i,j,n)~=0

H(n) = -P(i,j,n)*log(P(i,j,n))+H(n)%%熵

end

I(n) = (i-j)^2*P(i,j,n)+I(n) %%惯性矩

Ux(n) = i*P(i,j,n)+Ux(n)%相关性中μx

Uy(n) = j*P(i,j,n)+Uy(n)%相关性中μy

end

end

end

for n = 1:4

for i = 1:16

for j = 1:16

deltaX(n) = (i-Ux(n))^2*P(i,j,n)+deltaX(n)%相关性中σx

deltaY(n) = (j-Uy(n))^2*P(i,j,n)+deltaY(n)%相关性中σy

C(n) = i*j*P(i,j,n)+C(n)

end

end

C(n) = (C(n)-Ux(n)*Uy(n))/deltaX(n)/deltaY(n)%相关性

end

%--------------------------------------------------------------------------

%求能量、熵、惯性矩、相关的均值和标准差作为最终8维纹理特征

%--------------------------------------------------------------------------

a1 = mean(E)

b1 = sqrt(cov(E))

a2 = mean(H)

b2 = sqrt(cov(H))

a3 = mean(I)

b3 = sqrt(cov(I))

a4 = mean(C)

b4 = sqrt(cov(C))

sprintf('0,45,90,135方向上的能量依次为: %f, %f, %f, %f',E(1),E(2),E(3),E(4)) % 输出数据

sprintf('0,45,90,135方向上的熵依次为: %f, %f, %f, %f',H(1),H(2),H(3),H(4)) % 输出数据

sprintf('0,45,90,135方向上的惯性矩依次为: %f, %f, %f, %f',I(1),I(2),I(3),I(4)) % 输出数据

sprintf('0,45,90,135方向上的相关性依次为: %f, %f, %f, %f',C(1),C(2),C(3),C(4)) % 输出数据

这是我最近用过的求灰度共生矩阵及其四个参数的程序,你可以参考一下。

如下:

EntropyService:熵(shang)服务,用于产生随机数

PowerManagerService:电源管理服务

ActivityManagerService:最核心服务之一,Activity管理服务

TelephonyRegistry:电话服务,电话底层通知服务

PackageManagerService:程序包管理服务

AccountManagerService:联系人帐户管理服务

ContentService:内容提供器的服务,提供跨进程数据交换

LightsService:光感应传感器服务

BatteryService:电池服务,当电量不足时发广播

VibratorService:震动器服务

AlarmManagerService:闹钟服务

WindowManagerService:窗口管理服务

BluetoothService:蓝牙服务

InputMethodManagerService:输入法服务,打开关闭输入法

AccessibilityManagerService:辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击、焦点等事件分发管理服务

DevicePolicyManagerService:提供一些系统级别的设置及属性

StatusBarManagerService:状态栏管理服务

ClipboardService:粘贴板服务

NetworkManagementService:手机网络管理服务

TextServicesManagerService:

NetworkStatsService:手机网络状态服务

NetworkPolicyManagerService:

WifiP2pService:Wifi点对点直联服务

WifiService:WIFI服务

ConnectivityService:网络连接状态服务

ThrottleService:modem节流阀控制服务

MountService:磁盘加载服务,通常也mountd和vold服务结合

NotificationManagerService:通知管理服务,通常和StatusBarManagerService

DeviceStorageMonitorService:存储设备容量监听服务

LocationManagerService:位置管理服务

CountryDetectorService:检查当前用户所在的国家

SearchManagerService:搜索管理服务

DropBoxManagerService:系统日志文件管理服务(大部分程序错误信息)

WallpaperManagerService:壁纸管理服务

AudioService:AudioFlinger上层的封装的音量控制管理服务

UsbService:USB Host和device管理服务

UiModeManagerService:UI模式管理服务,监听车载、座机等场合下UI的变化

BackupManagerService:备份服务

AppWidgetService:应用桌面部件服务

RecognitionManagerService:身份识别服务

DiskStatsService:磁盘统计服务

SamplingProfilerService:性能统计服务

NetworkTimeUpdateService:网络时间更新服务

从事软件开发多年,在编程行业真正的架构师比例少的可怜,就目前国内软件开发环境而言,真正意义的架构师还不是很多,因为大部分的代码框架几乎从开源代码社区里面拿出来,然后定制成自己公司产品需要的,其中研究框架的时间比较长的,并且能够深度定制的程序员就算是高手了,因为很多开源的代码更新速度非常快速,能跟上开源社区的代码更新速度的企业已经是实力非常强的公司了,国内企业现在真正意义上的从头开始设计一个框架然后推向市场相对比较少。

经过十几年的发展,国内编程人才的平均水平已经上来了,虽然在顶级程序员由于在编程底蕴以及生态系统这块有差距,但基层的程序员水平已经上来了,国内很多互联网公司做的产品有些已经不弱于欧美等企业,这些都是国内程序员水平提升的结果,而且现在由于培训行业在国内普及,入门级别的程序员在国内数量巨大,所以很多人喊着国内程序员行业已经饱和了,已经不适合再去从事程序员的工作了。

事实上国内软件行业内需依然足够多,特别是现在的三四线城市都陆续出现了软件公司,而且规模和数量都在提升,国内企业对中高级程序员的需求量还是非常巨大,五六年大小公司对于这类的人才招聘一直没有停止过,而且薪资水平还维持在非常高的水准,了解这个行业现状对于规划自己的职业生涯还是有着非常大的好处。

架构师这种职位可遇不可求,基本上国内架构师都是自己本公司内的优秀的软件工程师,成为了优秀的程序员并且在公司内部深得公司的信任愿意给这种突破的机会,抓住了后边的就会给与架构师的待遇,不是每个程序员天生就是做架构师的料,关键还在于平时的积累,有了机会抓住了,要成为架构师先要自己成为一个优秀的程序员,优秀的程序员需要具备什么样子的因素,现在就根据自己技术生涯的一些经历分享给大家。

基本功扎实。 很多程序员在入门之前由于在学校里面比较重视基础,还能看看基础,在成为了程序员之后就开始放松了对这方面的要求,所以导致很多程序员见到有笔试的公司,直接就选择了放弃走人,不能讲这类的程序员水平不行,但起码不是优秀程序员的范畴, 优秀的程序员是经得住基本功考验的,是不怕这些所谓的笔试题目的。

算法扎实。 很多程序员做了很长时间还不觉得算法挺重要,算法贯穿整个技术生涯,如果没有意识到这点说明意识层面还没理解到,证明需要弥补的东西还是非常多,有些程序员可能是学习了一门编程语言就匆匆去找工作了,运气还不错还找到工作了,没有很好的规划技术生涯路线,一个标准的程序员需要的一门基础的编程语言,熟悉数据结构,并且穿插着学习算法,这三样也是优秀程序员的标配,学习技术不是由着自己性子去做事,需要有规划,这其中不能少了算法的因子。

锤炼编程思想。 很多程序员觉得能够写代码,时间长了经验到位了慢慢就能熬成资深技术专家了,程序员不是靠着熬日子过的,需要不断的提炼编程思想,举个简单的例子,做网络编程如果懂得了一门编程语言的编程经验,相信切换到别的语言只需要很短时间内就能搞定,而且积累总结类似的场景以后遇到这种场景都能灵活应对,还能同步迁移到类似的场景,不能只是为了做而作,仅仅就是为了完成任务,那么提升的空间有限,不能因为工作承担的东西就这么点,而不去补充其余的东西,善于总结也是优秀程序员需要具备的一种意识。

成为架构师没有所谓的模板,而且有些人一辈子也没有这种机会,但想要达到这种境界就需要先让自己成为一个优秀的程序员,这样子遇到有理想的企业抓住机会就上去了,一旦进入这个级别后面的编程生涯就会有根本的变化了,关键在于平时一点一滴的积累,让自己长期处于一种高效的学习状态,有太多的程序员经历了几年的适应期就提前让自己进入了舒适期,结果随着年龄的增长技能没有相应的跟上导致年龄大了竞争力下降,出现了老了被企业淘汰的悲剧,什么样子的态度决定什么样子的人生,也就决定了什么样子的结局,希望能帮到你。

作为一名IT行业的从业者,同时也是一名计算机专业的研究生导师,我来回答一下这个问题。

首先,目前IT行业内大量的程序员确实无法成长为架构师,主要原因集中在三点,其一是自身的知识结构不足以支撑向架构师方向发展;其二是岗位工作任务受限;其三是行业迭代速度太快,学习压力较大。

早期的架构师主要集中在后端领域,针对于不同的开发领域,对于架构师的要求也不尽相同。总的来说,架构师的任务主要集中在三个方面,其一是整体技术框架设计;其二是技术选型;其三是解决难点问题。所以对于程序员来说,如果想成长为架构师,需要做好以下几个方面的知识储备:

第一:丰富的开发经验。 开发经验通常是软件架构师的基本要求,通常软件架构师都是从初级程序员、主力程序员、研发级程序员等岗位一步一步成长起来的,每一个阶段都会积累一定的开发经验,这些经验对于架构师的方案设计会起到重要的作用。对于大量的程序员来说,从主力程序员向研发级程序员发展会存在较大的困难,主要原因就是基础知识结构的问题,不少程序员通过读研的方式完成这一步升级。

第二:丰富的知识结构。 架构师的知识结构不仅仅局限在技术层面,还需要掌握大量的行业知识,不同行业领域往往有不同的特点,要能够根据这些特点来完成具体的方案设计。

第三:紧跟技术发展趋势。 架构师一定要紧跟技术发展趋势,同时能够对于未来的发展方向有较强的认知能力,这对于架构师的方案设计会起到重要的作用。对于技术趋势的认知能力,是判断一名架构师能力的重要因素。

架构师并不是一个很好玩的升级路线。

相对于架构师的开发工作。研发工作更有趣,更容易得到 社会 的承认,不论是图形学,还是人工智能,区块链,甚至黑客(网络安全),凭借你的智慧和努力,可以在短时间内取得成就,并达到一个很漂亮的高度。研发方面是拼年轻,智商和体力的工作,有众多的天才少年取得漂亮的成果,每年有大量新的技术突破和文献等着大家研究。你做的每一件事情,都能表现出漂亮的成果,全局光照,计算机视觉。或者很容易赚到很多的钱,自动驾驶或者区块链ico,就算做 游戏 外挂,其收入也大得超乎你的想象。

而架构师不是,架构师拼的只有经验,正确的方法和项目数量。《C++程序设计新思维》里面有一句话:“只有天才的程序员没有天才的构架师。” 在构架师的世界里不存在天才,只存在重构。一定要有正确的方法(敏捷开发),然后就是无数个项目和时间的铺垫。然而对一个架构师应该明确,我们的职责是内部质量而不是外部质量,我们要把软件做的强壮且易易扩展。但你会发现,对于外行麻瓜来说,这根本不吸引人,麻瓜老板经常说一句话:你功能做不出来我们公司就破产了,别他妈的再花时间重构了。

至于为什么架构师很少

内部原因是: 架构师太无趣了,相对于图形学光照算法,你却强调测试驱动重构持续集成。研发工程师会得到大量的外部激励,所有人都去赞扬他们的成果。而构架师需要从自身产生激励的能量,比如对代码的洁癖,重构在不改变功能的情况下不断优化代码质量,一个分层,一个正确的依赖关系,甚至一个精简美丽的命名,都需要由衷地感到兴奋和刺激。否则很难熬下来。

外部原因是: 浮躁的 社会 容不下一个架构师成长的时间和空间。一个框架师需要大量的项目经验,超级长的编码时间。坚持正确的方法和一个融洽配合的团队。国外的架构师都是大胡子,而国内程序员到30岁,老婆就催着要去做管理岗位了。和研发工作拼智商不同,架构师就拼的是经验,没大胡子没五六十岁很难成为xx之父这个级别。

行业原因是: 架构师容不下架构师。架构是艺术不是科学,没有一个统一的标准,每个成型的架构师心里都有一套属于自己的程序结构和原则,你可以看到十个图形学程序员基于一个算法合作,但你很难看到两个架构师做一个项目不打架的。架构师需要有自己的团队来验证自己的观点和共同进步,但就如同食肉动物永远是食草动物的十分之一,行业也没那么多团队给架构师来糟蹋。

经历过很多项目洗礼,并有自己的想法和能力的架构师,必然是稀有动物。

但看起来无聊的架构师有什么用呢?

他是辅助英雄,给整个团队加各种属性光环:降低代码中的混乱(熵),让团队中初级的程序员做出高级的代码,提高单位时间效率避免加班,让团队更容易进入未知领域,大幅度降低企业成本。

我现在做的混合现实领域,这是一个新的领域,有一个优秀的架构师可以在没有前人经验的情况下开疆辟土,并且可以带起来整个团队的开发质量,降低成本给客户更多的获利空间。

这个问题不知道提出来的缘由是啥,其实问题不是很合适,不过还是一分为二的来回答一下,如下:

架构师不是谁都能做到的,我想说如下几点:首先,应具备的素质应该是快速的学习能力,需要从平常的任何工作活动中,快速学习,包括从自己的本质工作完成,以及与他人的交流中,而后者又尤其重要,从别人那儿学来,而快速形成自己的理解并超越对方,而这,从自然规律角度上来讲,这只有少数人能做到;

其次,需要具有全局的视野,能平衡整系统各子系统之间的解耦与耦合,这个需要积累,需要在各子系统内有实际项目的、比较成功的设计编码的问题处理能力,而尤其是问题处理能力又尤为重要,这也不是段时间能达到。

第三,在这个行当内,能静下心来踏踏实实,保持饥渴的学习,保持积极正向的心态,不断的越挫越勇,始终往设计架构方面努力,在当下整个行业浮躁的环境下,很对都想通过不断的跳槽来达到涨薪的目的,这又会淘汰一大部分人。

最后,即便具备了素质,你能否当上架构师,取决于客观因素了。因为一个架构师,决定了他所在领域的发展规划,以及当前的问题现状的改进,这个位置至关重要,不是那个人,上一层组织关系是不会让你做这个位置的,上层组织还会考察你除了技术能力以外的,诸如与人沟通,管理你的上下级,包括你的上级的上一级到连三级的关系,关系到你的直接老板的,这些其实就很难说了。

呵呵,当然了,还有其他很多了,靠这个问题是说不清道不全的。

真正的软件架构师对各方面的职业素养都要求比较高。架构师的工作,不是平时工作的简单堆叠,除了专业技能要过硬外,还要思维活,想东西细致全面,需要自己去主动去接纳工作以外的大量知识。此外,在性格方面也有一定要求,一个软件架构师往往还需要具备善于沟通的品质。

总而言之就是要技术好、思维活、会交际。大多数程序员做不到架构师的位置主要是因为自身能力达不到,其次是一个公司里面架构师占比本来就想小。

一般程序员在公司负责的工作主要是维护日常的需求,在原有的架构上进行修改,所以很少会接触到架构层面的东西。长期缺少接触相关的知识及业务的机会,久而久之离架构师的标准也会越来越远。

年轻的程序员在知识储备上无法达到成为架构师的标准。

现代的高可用架构一般为:RDS、Cache、MQ、后端服务、监控服务。而随便拿其中一个点,都有着非常多的技术点知识点需要掌握。

比如在多系统交互中,如何保证MQ中的消息能被对方系统消费,如何设计高可用的服务负载均衡,这些都是需要很多经验才可以解决,但是一般的程序员又不容易接触到架构设计。

而年纪大点的程序员要么是后期缺少折腾的的动力,要么在职业发展途径走到不同的分岔路口,最终走上架构师这个树枝上的寥寥无几。

小富即安的心理。很多程序员满足于现状,缺少坚持不断学习不断提高的动力,每个月拿着万把块钱的工资,心安理得,懒得去折腾。

一个公司架构师在广大码农里面占比还不到10%,能成为架构师的一般都在公司里担任研发和管理的角色,想象一下公司团队的人员金字塔你就知道竞争力有多大了。

平常,开发的团队一般都是10多人组成。几个团队间一般会存在一个技术面最广、技术经验较充足的人,叫做架构师或者说是TL。而架构师的存在,一般在众多的码农中占的比例少之又少,可能连码农总人数的10% 都达不到。软件架构师也存在初中高级。

码农都会写代码,对计算机编程语言都有自身的理解。但是很多时候,程序员或者说是码农只是机械的完成自身的编码工作。为了完成任务,成长有限。

看到这里,很多人都会说:编码时间长了,经验积累的足够,自身也就逐渐成为了资深技术专家。想法其实不能说是不正确,在一个人见多识广后,自然自身的内涵也就足够的丰富。从码农的角度出发。除了架构师,很少有35岁以上的人士会在互联网做程序开发。而一个人想要通过机械性质的编码积累经验。需要多少年成长才能见多识广呢?是否会有码农坚持到那一时刻呢?一个值得商榷的问题?

码农是一份年轻人为主的职业。平均从业者的年龄都是20多岁。慢慢熬、慢慢积累在码农中也不能说错。但是很多人在软件开发领域积累一定的经验后就会转型不做开发。

所以说,长久时间的码农很少。而在短暂的码农开发软件的工作中,脱颖而出,成长起来的人更少。

些许拙见,供您参考。

从事互联网开发多年,欢迎大家骚扰

小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL)。所以,架构师在广大码农中的占比大概平均不到 10%。而架构师也可以分为初级、中级、高级三档,江湖上真正高水平的软件架构师就更少了。

所以,大部分(超过九成的)码农干上许多年,还是做不了架构师,这是什么原因造成的呢?

1:码农分为真的能写代码的,以及自认为能写代码的。

2:真的能写代码的码农又分为自认为写的不错的,以及真的还不错的。

3:真的能写不错代码的码农又分为会钻研会不断优化的,以及安于现状的。

4:会钻研的码农又分为喜欢广度了解新技术蜻蜓点水的,以及深入钻研用到知识的。

了解广度的码农又有少部分愿意深入某些技术,喜欢深入研究的又往往缺乏广度知识。

6:为业务而技术的深度广度都了解的码农,又需要有良好的沟通能力。

7:而沟通好的,又有一部分当PM去了。

8:然后剩下的,又有一部分慢慢脱离实际开发(不再做任何实现)或者开始依靠拿各种中间件搭积木来作为“架构”手段。

9:除去这些,剩下对业务有一定了解,对技术广度上有多种涉猎,深度上对部分技术研究彻底,还有很重要的一点,考虑问题足够细致全面。

10:细致全面善于沟通,技术上深度广度都没问题, 又喜欢这个工作,还会不时做底层实现,从业务和开发两个角度出发,搭出“架构”来是为了开发效率,为了运行效率,为了开发质量,为了业务灵活和运行稳定,为了维护方便等等这样的人,个人认为可以称为“架构师”。

而真能满足这种需求的,别说题主的10%的比例,1%能不能达到我也持怀疑态度。其实现在的“架构师”大多数都停留在8这个层次,甚至很多在5这个层次就当上title上的架构师了。

总之,成为架构师,不仅仅是工作上的简单积累,更需要主动接纳工作外的大量知识,同时,对性格上对于非技术能力上也有一定的要求,不仅如此连思维方式都很重要,外加职业发展中又有很多岔路,最后走到架构师这根树枝上的就寥寥可数了。

如果你想要往架构师的方向发展的话,那或许你可以看一下我分享给你的这份进阶路线图,主要针对2到5年及以上工作经验的Java开发人员,里面的技术包涵了Java高并发、分布式、微服务、源码分析、高性能等技术,这些也是目前互联网企业比较常用的技术,那么来详细看看。(图片可以保存)

一:常见模式与工具

学习Java技术体系,设计模式,流行的框架与组件

常见的设计模式,编码必备

Spring5,做应用必不可少的最新框架

MyBatis,玩数据库必不可少的组件

二:工程化与工具

工欲善其事必先利其器,不管是小白,还是资深开发,玩Java技术体系,选择好的工具,提升开发效率和团队协作效率,是必不可少的:

Maven,项目管理

Jenkins,持续集成

Sonar,代码质量管理

Git,版本管理

三:分布式架构

高并发,高可用,海量数据,没有分布式的架构知识肯定是玩不转的:

分布式架构原理

分布式架构策略

分布式中间件

分布式架构实战

四:微服务架构

业务越来越复杂,服务分层,微服务架构是架构升级的必由之路,Java技术体系,和微服务相关的技术有哪些呢?

微服务框架

Spring Cloud

Docker与虚拟化

微服务架构

五:性能优化

任何脱离细节的ppt架构师都是耍流氓,向上能运筹帷幄,向下能解决一线性能问题,Java技术体系,需要了解:

性能指标体系

JVM调优

Web调优

DB调优

如何一起学习,有没有免费资料? 有需要的滴滴滴哦

软件架构师?似乎是个明确的职位或者岗位了。然而,他在软件产品开发过程中,充当什么角色?起什么作用?确众说纷纭,缺乏共识。成为一名架构师,码农根本没有明确的努力目标。这是问题的关键,架构师,是上级领导、老板对某些软件开发人员的“认同”,是某种管理理念的体现,不是软件产品生产活动中某个具体的岗位、角色。