图像特征-上篇(10大图像特征)

举报
AI浩 发表于 2021/12/22 23:22:19 2021/12/22
【摘要】 图像特征 和文本特征类似,图像特征也是梯度提升树模型非常难以挖掘的一类数据,目前图像相关的问题,例如图像分类,图像分割等等几乎都是以神经网络为主的模型,但是在一些多模态的问题中,例如商品搜索推荐的问题中,里面既包含图像信息又含有文本信息等,这个时候基于梯度提升树模型的建模方案还是至关重要的,这个时候为了更好地使用所有的数据信息,我...

图像特征

图片

和文本特征类似,图像特征也是梯度提升树模型非常难以挖掘的一类数据,目前图像相关的问题,例如图像分类,图像分割等等几乎都是以神经网络为主的模型,但是在一些多模态的问题中,例如商品搜索推荐的问题中,里面既包含图像信息又含有文本信息等,这个时候基于梯度提升树模型的建模方案还是至关重要的,这个时候为了更好地使用所有的数据信息,我们需要对图像特征进行多方位的提取。

图片

本节我们将会介绍图像特征提取中常常采用的方法技术。

图片

图片

1.图像长宽

图像的长宽可以表示图像的大小。

  • 图像的长宽以及channel数:表示图像的大小;


  
  1. # !pip3 install opencv-python
  2. import cv2
  3. img = cv2.imread('./imgs/chapter7/img_example.jpeg')
  4. img.shape
(810, 1440, 3)
 

图片

图片

2.图像格式特征

图像的格式有非常多种,例如bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp,avif等,不同格式的图像也会含有不同的信息,不同情况下我们会使用不同的图像形式进行存储。图像的存储格式主要可以反映真实性、透明性、矢量性(该回答摘自知乎jpg和png有什么区别?下showvim的回答。

图片

  • 真实性中就是色彩度、位深、损耗(压缩)等;(jpg、jpeg、gif、tiff、bmp)

  • 透明性就很明显了,就是支技透明的特性,但这里也有一个就是位深,他会影响透明度的深度png8与png24的差异就在这里;(png)

  • 特殊动画,就是支持帧的特点,可以做成动画;(gif)4、 矢量性就可还原度,可再编辑的特性,通俗一点来讲就是很多人常说的放大不模糊的特点,因为他们的组成是由公式曲线方程生成的(但我们是可视化的编辑)(ai、cdr、eps)

这些信息的提取只需要对图像的文本进行正则匹配即可。

图片

图片

3.图像的创建时间

在一些图像分类的问题中,有一些图片是作者拍摄的或者收集的,所以相邻时间段的图片往往是一类图像,这个时候图像的创建时间就是一个非常重要的特征。


  
  1. import time
  2. import datetime 
  3. import os
  4. def TimeStampToTime(timestamp):
  5.     timeStruct = time.localtime(timestamp)
  6.     return time.strftime('%Y-%m-%d %H:%M:%S',timeStruct)
  7. def get_FileCreateTime(filePath): 
  8.     filePath = filePath
  9.     t = os.path.getctime(filePath)
  10.     return TimeStampToTime(t)
  11. get_FileCreateTime('./imgs/chapter7/img_example.jpeg')
'2021-04-25 13:24:03'
 

图片

图片

4.图片的亮度特征

1.暗度

在很多广告中,图片的亮度如果太低的话,会让很多消费者觉得看不清,不利于宣传,用于也不会去点击,所以图片的亮度信息在这个时候是一种不错的特征。对图像中突出的颜色的分析可以很好地表明图像是否暗淡。


  
  1. from collections import defaultdict
  2. from scipy.stats import itemfreq
  3. from scipy import ndimage as ndi
  4. import matplotlib.pyplot as plt
  5. from skimage import feature
  6. from PIL import Image as IMG
  7. import numpy as np
  8. import pandas as pd 
  9. import operator
  10. import cv2
  11. import os 
  12. def color_analysis(img):
  13.     # obtain the color palatte of the image 
  14.     palatte = defaultdict(int)
  15.     for pixel in img.getdata():
  16.         palatte[pixel] += 1
  17.     
  18.     # sort the colors present in the image 
  19.     sorted_x = sorted(palatte.items(), key=operator.itemgetter(1), reverse = True)
  20.     light_shade, dark_shade, shade_count, pixel_limit = 00025
  21.     for i, x in enumerate(sorted_x[:pixel_limit]):
  22.         if all(xx <= 20 for xx in x[0][:3]): ## dull : too much darkness 
  23.             dark_shade += x[1]
  24.         if all(xx >= 240 for xx in x[0][:3]): ## bright : too much whiteness 
  25.             light_shade += x[1]
  26.         shade_count += x[1]
  27.         
  28.     light_percent = round((float(light_shade)/shade_count)*1002)
  29.     dark_percent = round((float(dark_shade)/shade_count)*1002)
  30.     return light_percent, dark_percent
  31. def perform_color_analysis(img, flag):
  32.     path   = img 
  33.     im     = IMG.open(path)
  34.     
  35.     size   = im.size
  36.     halves = (size[0]/2, size[1]/2)
  37.     im1    = im.crop((00, size[0], halves[1]))
  38.     im2    = im.crop((0, halves[1], size[0], size[1]))
  39.     try:
  40.         light_percent1, dark_percent1 = color_analysis(im1)
  41.         light_percent2, dark_percent2 = color_analysis(im2)
  42.     except Exception as e:
  43.         return None
  44.     light_percent = (light_percent1 + light_percent2)/2 
  45.     dark_percent = (dark_percent1 + dark_percent2)/2 
  46.     
  47.     if flag == 'black':
  48.         return dark_percent
  49.     elif flag == 'white':
  50.         return light_percent
  51.     else:
  52.         return None

  
  1. df = pd.DataFrame()
  2. df['image'] = ['./imgs/chapter7/img_example.jpeg']
  3. df['dullness'] = df['image'].apply(lambda x : perform_color_analysis(x, 'black'))
  4. df.head()
  image dullness
0 ./imgs/chapter7/img_example.jpeg 39.735

2.亮度

如果图像太白或者太亮,这也是不利于图片的美观的,这种图片的点击率也会相对较低。此处我们判断所有通道上最亮的N个像素点的值大于某个阈值的比例来作为图像的亮度信息。


  
  1. df['whiteness'] = df['image'].apply(lambda x : perform_color_analysis(x, 'white'))
  2. df
  image dullness whiteness
0 ./imgs/chapter7/img_example.jpeg 39.735 0.0


图片

图片

5.图像均匀度

某些图像可能不包含像素变化,并且完全uniform的。平均像素宽度是表示图像中存在的边缘数量的度量。如果这个数字非常低,那么图像很可能是一个单一的的图像,无法表示正确的内容。此处我们可以直接使用skimage的Canny检测。


  
  1. def average_pixel_width(img):
  2.     path = img 
  3.     im = IMG.open(path)    
  4.     im_array = np.asarray(im.convert(mode='L'))
  5.     edges_sigma1 = feature.canny(im_array, sigma=3)
  6.     apw = (float(np.sum(edges_sigma1)) / (im.size[0]*im.size[1]))
  7.     return apw*100

  
  1. df['average_pixel_width'] = df['image'].apply(lambda x : average_pixel_width(x))
  2. df[['image','average_pixel_width']]
  image average_pixel_width
0 ./imgs/chapter7/img_example.jpeg 1.338563


图片

图片

6.图像的主导颜色

图片中使用的颜色在吸引用户方面起着重要的作用。可以创建与颜色相关的附加功能,例如主色和平均色。


  
  1. def get_dominant_color(img):
  2.     path   = img 
  3.     img    = cv2.imread(path)
  4.     arr    = np.float32(img)
  5.     pixels = arr.reshape((-13))
  6.     n_colors = 5
  7.     criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 200, .1)
  8.     flags = cv2.KMEANS_RANDOM_CENTERS
  9.     _, labels, centroids = cv2.kmeans(pixels, n_colors, None, criteria, 10, flags)
  10.     palette   = np.uint8(centroids)
  11.     quantized = palette[labels.flatten()]
  12.     quantized = quantized.reshape(img.shape)
  13.     dominant_color = palette[np.argmax(itemfreq(labels)[:, -1])]
  14.     return dominant_color
  15. df['dominant_color'] = df['image'].apply(get_dominant_color)
  16. df

  
  1. <ipython-input-92-970fc6abdf35>:16: DeprecationWarning: `itemfreq` is deprecated!
  2. `itemfreq` is deprecated and will be removed in a future version. Use instead `np.unique(..., return_counts=True)`
  3. dominant_color = palette[np.argmax(itemfreq(labels)[:, -1])]
  image dullness whiteness average_pixel_width dominant_color
0 ./imgs/chapter7/img_example.jpeg 39.735 0.0 1.338563 [163, 198, 219]

  
  1. df['dominant_red'] = df['dominant_color'].apply(lambda x: x[0]) / 255
  2. df['dominant_green'] = df['dominant_color'].apply(lambda x: x[1]) / 255
  3. df['dominant_blue'] = df['dominant_color'].apply(lambda x: x[2]) / 255
  4. df[['image','dominant_red','dominant_green','dominant_blue']]
  image dominant_red dominant_green dominant_blue
0 ./imgs/chapter7/img_example.jpeg 0.639216 0.776471 0.858824


图片

图片

7.各channel的统计特征

各个channel的全局统计特征,例如,各个channel的均值,方差,中位数,众数,分位数等等。


  
  1. # - 以均值为例
  2. def get_average_color(img):
  3.     path = img 
  4.     img = cv2.imread(path)
  5.     average_color = [img[:, :, i].mean() for i in range(img.shape[-1])]
  6.     return average_color
  7. df['average_color'] = df['image'].apply(get_average_color)
  8. df['average_red']   = df['average_color'].apply(lambda x: x[0]) / 255
  9. df['average_green'] = df['average_color'].apply(lambda x: x[1]) / 255
  10. df['average_blue']  = df['average_color'].apply(lambda x: x[2]) / 255
  11. df[['image','average_red','average_green','average_blue']]
  image average_red average_green average_blue
0 ./imgs/chapter7/img_example.jpeg 0.497662 0.50784 0.532006


图片

图片

8.图像的模糊特征

该方法摘自于《Diatom Autofocusing in Brightfield Microscopy: A Comparative Study》,本文作者Pech-Pacheco等人提出了一种Laplacian滤波器的变种,可用来评估图像的模糊度,在该技术中,图像的单通道和Laplacian Filter卷积。如果指定的值小于阈值,则图像模糊,否则不会。


  
  1. def get_blurrness_score(image):
  2.     path =  image 
  3.     image = cv2.imread(path)
  4.     image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  5.     fm = cv2.Laplacian(image, cv2.CV_64F).var()
  6.     return fm
  7. df['blurrness'] = df['image'].apply(get_blurrness_score)
  8. df[['image','blurrness']].head(5)
  image blurrness
0 ./imgs/chapter7/img_example.jpeg 475.782864


图片

图片

9.图像直方图特征

对图像中的所有像素点进行分箱,统计每个直方图中像素的个数,注意:很多时候图像的大小不一样,所以一般使用百分比特征效果会好一些。

图片

有些时候我们会选择分箱的个数多一些,为了将产出的新特征加入到模型中,会对特征进行PCA或者SVD等降维操作。


  
  1. def get_histogram_features(image):
  2.     path =  image 
  3.     image = cv2.imread(path) 
  4.     print(image.ravel().shape)
  5.     hist, bins  = np.histogram(image.ravel(), bins=50)
  6.      
  7.     return hist / image.ravel().shape
  8. hist = df['image'].apply(get_histogram_features)
  9. hist[0]

  
  1. (3499200,)
  2. array([0.0054261 , 0.01778464, 0.02784208, 0.02863769, 0.01264546,
  3. 0.01067358, 0.01119999, 0.00853052, 0.01141918, 0.0114409 ,
  4. 0.01528206, 0.0153698 , 0.01494227, 0.01478738, 0.01672297,
  5. 0.01708791, 0.02324588, 0.02150692, 0.02266575, 0.02503229,
  6. 0.0280487 , 0.02289752, 0.02528178, 0.02137889, 0.02387231,
  7. 0.02164495, 0.02553927, 0.02519462, 0.02330447, 0.02359082,
  8. 0.02976452, 0.02889003, 0.03554155, 0.04038637, 0.03270405,
  9. 0.02817644, 0.02875229, 0.0253618 , 0.02177298, 0.02141518,
  10. 0.02612597, 0.01889403, 0.01441044, 0.01199503, 0.01037809,
  11. 0.00855738, 0.01004915, 0.01521205, 0.00871342, 0.00990255])

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/116144633

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。