基于K-means算法的数码迷彩生成——python实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:本文主要是根据西安工业大学喻钧教授的论文——仿造数码迷彩的设计方法,来复现了一种根据目标背景图像生成仿造数码迷彩的设计方法。首先将背景图案进行颜色空间转换,采用K均值聚类分析方法提取背景主色。由侦测距离确定数码单元的最小尺寸,最后生成数码迷彩斑块。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数码迷彩

伪装技术总是通过各种巧妙的伪装手段进行隐真示假, 以蒙蔽敌方的侦察. 迷彩作为最常用的一种伪装方式, 是一种保障军事实力、 对抗现代侦察探测与精确制导武器捕获的重要手段. 然而, 普通迷彩的视觉区分度强, 仅适于对抗固定距离或一定范围内、低分辨率的光学侦察, 难以对付不同距离下的高分辨率航空和卫星成像侦察. 而由计算机生成的数码迷彩(也叫数字迷彩) 则克服了这一缺陷, 能够有效地应对不同距离以及高精度、 高分辨率的空间侦察. 它通过不同色块的多种排列组合, 利用空间混色原理使色块相互渗透模拟背景的颜色和纹理特征, 以达到与背景融合的目的。 最初的数码迷彩设计通常将已有的普通迷彩图案直接转换成细碎的数码方块图案, 其重点在于对不同颜色间边缘的处理. 这样生成的数码迷彩在伪装效果上有一定的改善和提高, 但由于没有反映目标背景的颜色、 纹理等信息, 还算不上真正意义上的数码迷彩.仿造迷彩是模仿背景斑块图案的多色迷彩, 主要用于伪装多色背景上的固定目标或长时间停留的活动目标. 本文借助数字图像处理技术, 通过提取自然背景的主色、 斑块等特征信息, 设计了以像素点阵为基本单元且能反映背景斑块特征的仿造数码迷彩图案。

二、K-means算法提取主色

这个看我的上一篇文章:基于python的K-means聚类提取图片主色

三、python算法实现

1、在IDE中导入需要的库

import cv2
import numpy as np
from skimage import io
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

2、K-means聚类提取主色

将输入的图像进行k-means聚类操作,提取三种主要的背景颜色。将提取的三种背景主色分布用不同的标签标记。

#####################图像转换到Lab空间+背景主色提取########################
#利用k-means聚类算法提取背景图的主色
img=cv2.imread("cao3.jpg")
img=cv2.medianBlur(img, 3)
[m0,n0,q0]=img.shape

#规范尺寸方便后续操作
img_rgb=cv2.resize(img,(120,120))
[m,n,q]=img_rgb.shape

k=3
img_lab = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2LAB)
#cv2.imshow('Lab',img_lab)
#io.imsave('img_lab.jpg', img_lab)
img1 = img_lab.reshape((img_lab.shape[0] * img_lab.shape[1], img_lab.shape[2]))

#构建聚类器
kmeans=KMeans(n_clusters=k,max_iter=4000, init='k-means++', n_init=50)
kmeans.fit(img1)#聚类
lab=kmeans.labels_#获取聚类标签
label=lab.reshape([m,n])#将聚类结果转换成图像大小的矩阵

#获取聚类中心(背景主色)
centroids = kmeans.cluster_centers_
centroids = centroids.astype(np.uint8)


label1=np.array(label,dtype=np.float64)
label1=cv2.resize(label1,(n0,m0))
plt.figure(0)
plt.subplot(221),plt.imshow(label1,cmap='gray'),plt.title('label')

3、生成迷彩斑块

根据背景图像中主体颜色的亮度分布情况提取图像中斑点的形状和空间分布特征

s=3
for i in range(0,m,s):
    for j in range(0,n,s):
        sumi=0
        for x in range(i,i+s):
            for y in range(j,j+s):
                sumi=label[x,y]+sumi
        meani=round(sumi/(s*s))
        for x in range(i,i+s):
            for y in range(j,j+s):
                label[x,y]=meani
       
img_lab2=np.zeros_like(img_lab)
for i in range(m):
    for j in range(n):
        if label[i,j]==0:
            img_lab2[i,j]=centroids[0]
        elif label[i,j]==1:
            img_lab2[i,j]=centroids[1]
        elif label[i,j]==2:
            img_lab2[i,j]=centroids[2]
img_lab2=cv2.resize(img_lab2,(n0,m0))
img_rgb2=cv2.cvtColor(img_lab2, cv2.COLOR_LAB2BGR)

4、数码迷彩的生成

最后展示生成的数码迷彩结果:
在这里插入图片描述


参考文献

喻钧,双晓.仿造数码迷彩的设计方法[J].应用科学学报,2012,30(04):331-334.

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值