zoukankan      html  css  js  c++  java
  • 【数字图像处理】使用kmeans算法对TrueColor图片进行优化

    实验的主要内容是将truecolor的图片通过一个优化算法得到其256色的最优表示。本实验采用kmean做算法对像素的色彩进行聚类的计算,分类得到一个色彩数为256的CodeBook,和一个包含有CodeBook索引的矩阵,原图片的颜色值都从CodeBook中获取,colorMap矩阵保存其中像素颜色的索引值,这样通过索引恢复出一个近似的图片文件,达到比传统的GIF图像更好的效果。




     

    由上图可见,256色的GIF图像有明显的颗粒感,这是因为图像发色数过低造成的颜色不连贯。



     

    上图是通过优化算法计算的256色的图片,从图片上可以看出,颜色过渡平滑,几乎看不出颗粒感,相较于256色的GIF图像有明显的优势。


     

    从图片上可以很好的看出,GIF采用的ColorMap对图像有明显的失真,细节图中颗粒感明显,对比采用优化算法的细节图,同样是256色,优化算法处理之后的图片可以和采用24bitTrueColor的JPG图片相媲美,从图像中几乎看不出失真。



    源代码:

    main.py

     

    from colorMap import *
    
    fileName='lena.jpg'
    clusterNum=256
    codeBook,colorMap=kmeansImg(fileName,clusterNum)
    rimg=recoveryImg(codeBook,colorMap)
    cv2.imwrite('./r.jpg',rimg)
    cv2.imshow('rimg',rimg)
    img=cv2.imread('lena.jpg')
    cv2.imshow('img',img)
    cv2.waitKey()
    from scipy.cluster.vq import *
    from numpy import *
    import cv2
    
    def kmeansImg(fileName,clusterNum):
        img=cv2.imread(fileName)
        rl=img.shape[0]
        cl=img.shape[1]
        img=reshape(img,(img.shape[0]*img.shape[1],img.shape[2]))
        codeBook,dis1=kmeans(img,clusterNum)
        colorMap,dis2=vq(img,codeBook)
        colorMap=reshape(colorMap,(rl,cl))
        return codeBook,colorMap
    
    def recoveryImg(codeBook,colorMap):
        img=[]
        for r in range(colorMap.shape[0]):
            for l in range(colorMap.shape[1]):
                img.append(list(codeBook[colorMap[r,l]]))
        img=array(img)
        img=reshape(img,(colorMap.shape[0],colorMap.shape[1],3))
        return img    
            
    






  • 相关阅读:
    leetcode第四题
    解决Hystrix主线程结束,子线程拿不到request
    RabbitMQ如何保证消息的顺序性+解决消息积压+设计消息队列中间件
    RabbitMQ 如何保证消息不丢失?
    redis布隆过滤器的使用
    PageHelper自定义count
    mysqlbinlog 工具分析binlog日志
    linuxubuntu常用命令
    MySQL 常用命令
    Ubuntu 16.04 安装 Apache, MySQL, PHP7
  • 原文地址:https://www.cnblogs.com/pangblog/p/3402625.html
Copyright © 2011-2022 走看看