Функции изображения — часть 1 (10 основных функций изображения)

искусственный интеллект

особенности изображения

图片

Подобно текстовым функциям, функции изображений также являются типом данных, которые очень трудно добывать с помощью моделей деревьев с градиентным усилением.В настоящее время проблемы, связанные с изображениями, такие как классификация изображений, сегментация изображений и т. д., почти все модели, основанные на нейронные сети.В состоянии задачи, такой как задача поиска и рекомендации продукта, он содержит как информацию изображения, так и текстовую информацию и т. д. В настоящее время схема моделирования, основанная на модели дерева повышения градиента, все еще очень важна. В настоящее время, чтобы лучше использовать всю информацию о данных, нам нужно извлекать функции изображения в нескольких направлениях.

图片

В этом разделе мы познакомим вас с методами и приемами, обычно используемыми при извлечении признаков изображения.

图片

图片

1. Длина и ширина изображения

Длина и ширина изображения могут представлять размер изображения.

  • Длина и ширина изображения и количество каналов: указать размер изображения;
# !pip3 install opencv-python
import cv2
img = cv2.imread('./imgs/chapter7/img_example.jpeg')
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 и т. д. ., изображения в разных форматах также будут содержать разную информацию, и мы будем использовать разные форматы изображений для хранения при разных обстоятельствах. Формат хранения изображения может в основном отражать подлинность, прозрачность и векторный характер (этот ответ взят из Zhihu. В чем разница между jpg и png? См. ответ showvim.

图片

  • Подлинность — это цвет, разрядность, потери (сжатие) и т. д. (jpg, jpeg, gif, tiff, bmp)
  • Прозрачность очевидна, это характеристика поддерживающей технологии, но есть еще и разрядность, которая будет влиять на глубину прозрачности.Разница между png8 и png24 здесь;(png)
  • Специальная анимация - это особенность опорных кадров, которые можно превратить в анимацию;(gif) 4. Характеристики вектора можно восстановить, а можно снова отредактировать.Композиция формируется по формуле уравнения кривой (но мы визуальные монтаж) (ai, cdr, eps)

Для извлечения этой информации требуется только регулярное сопоставление текста изображения.

图片

图片

3. Время создания образа

В некоторых задачах классификации изображений некоторые изображения сделаны или собраны автором, поэтому изображения в смежные периоды времени часто являются типом изображения, и время создания изображения является очень важной характеристикой в ​​это время.

import time
import datetime 
import os

def TimeStampToTime(timestamp):
    timeStruct = time.localtime(timestamp)
    return time.strftime('%Y-%m-%d %H:%M:%S',timeStruct)

def get_FileCreateTime(filePath): 
    filePath = filePath
    t = os.path.getctime(filePath)
    return TimeStampToTime(t)

get_FileCreateTime('./imgs/chapter7/img_example.jpeg')
'2021-04-25 13:24:03'

图片

图片

4. Яркостные характеристики изображений

1. Темнота

Во многих рекламных объявлениях, если яркость изображения слишком низкая, это заставит многих потребителей почувствовать, что оно нечеткое, что не способствует рекламе, и не будет нажиматься при использовании, поэтому информация о яркости изображения является хорошей. особенность в это время. Анализ цветов, которые выделяются на изображении, может дать хорошее представление о том, является ли изображение тусклым.

from collections import defaultdict
from scipy.stats import itemfreq
from scipy import ndimage as ndi
import matplotlib.pyplot as plt
from skimage import feature
from PIL import Image as IMG
import numpy as np
import pandas as pd 
import operator
import cv2
import os 

def color_analysis(img):
    # obtain the color palatte of the image 
    palatte = defaultdict(int)
    for pixel in img.getdata():
        palatte[pixel] += 1
    
    # sort the colors present in the image 
    sorted_x = sorted(palatte.items(), key=operator.itemgetter(1), reverse = True)
    light_shade, dark_shade, shade_count, pixel_limit = 0, 0, 0, 25
    for i, x in enumerate(sorted_x[:pixel_limit]):
        if all(xx <= 20 for xx in x[0][:3]): ## dull : too much darkness 
            dark_shade += x[1]
        if all(xx >= 240 for xx in x[0][:3]): ## bright : too much whiteness 
            light_shade += x[1]
        shade_count += x[1]
        
    light_percent = round((float(light_shade)/shade_count)*100, 2)
    dark_percent = round((float(dark_shade)/shade_count)*100, 2)
    return light_percent, dark_percent

def perform_color_analysis(img, flag):
    path   = img 
    im     = IMG.open(path)
    
    size   = im.size
    halves = (size[0]/2, size[1]/2)
    im1    = im.crop((0, 0, size[0], halves[1]))
    im2    = im.crop((0, halves[1], size[0], size[1]))

    try:
        light_percent1, dark_percent1 = color_analysis(im1)
        light_percent2, dark_percent2 = color_analysis(im2)
    except Exception as e:
        return None

    light_percent = (light_percent1 + light_percent2)/2 
    dark_percent = (dark_percent1 + dark_percent2)/2 
    
    if flag == 'black':
        return dark_percent
    elif flag == 'white':
        return light_percent
    else:
        return None
df = pd.DataFrame()
df['image'] = ['./imgs/chapter7/img_example.jpeg']
df['dullness'] = df['image'].apply(lambda x : perform_color_analysis(x, 'black'))
df.head()
  image dullness
0 ./imgs/chapter7/img_example.jpeg 39.735

2. Яркость

Если изображение слишком белое или слишком яркое, это не способствует эстетике изображения, и кликабельность таких изображений будет относительно низкой. Здесь мы определяем соотношение самых ярких N пикселей на всех каналах, которые превышают определенный порог, как информацию о яркости изображения.

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


图片

图片

5. Однородность изображения

Некоторые изображения могут не содержать вариаций пикселей и быть полностью однородными. Средняя ширина в пикселях — это мера, представляющая количество ребер, присутствующих в изображении. Если это число очень низкое, то изображение, скорее всего, представляет собой одиночное изображение, не представляющее правильный контент. Здесь мы можем напрямую использовать обнаружение Canny в skimage.

def average_pixel_width(img):
    path = img 
    im = IMG.open(path)    
    im_array = np.asarray(im.convert(mode='L'))
    edges_sigma1 = feature.canny(im_array, sigma=3)
    apw = (float(np.sum(edges_sigma1)) / (im.size[0]*im.size[1]))
    return apw*100
df['average_pixel_width'] = df['image'].apply(lambda x : average_pixel_width(x))
df[['image','average_pixel_width']]
  image average_pixel_width
0 ./imgs/chapter7/img_example.jpeg 1.338563


图片

图片

6. Доминирующий цвет изображения

Цвета, используемые в изображениях, играют важную роль в привлечении пользователей. Могут быть созданы дополнительные функции, связанные с цветами, такие как доминирующие и средние цвета.

def get_dominant_color(img):
    path   = img 
    img    = cv2.imread(path)
    arr    = np.float32(img)
    pixels = arr.reshape((-1, 3))

    n_colors = 5
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 200, .1)
    flags = cv2.KMEANS_RANDOM_CENTERS
    _, labels, centroids = cv2.kmeans(pixels, n_colors, None, criteria, 10, flags)

    palette   = np.uint8(centroids)
    quantized = palette[labels.flatten()]
    quantized = quantized.reshape(img.shape)

    dominant_color = palette[np.argmax(itemfreq(labels)[:, -1])]
    return dominant_color

df['dominant_color'] = df['image'].apply(get_dominant_color)
df
<ipython-input-92-970fc6abdf35>:16: DeprecationWarning: `itemfreq` is deprecated!
`itemfreq` is deprecated and will be removed in a future version. Use instead `np.unique(..., return_counts=True)`
  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]
df['dominant_red'] = df['dominant_color'].apply(lambda x: x[0]) / 255
df['dominant_green'] = df['dominant_color'].apply(lambda x: x[1]) / 255
df['dominant_blue'] = df['dominant_color'].apply(lambda x: x[2]) / 255
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. Статистические характеристики каждого канала

Глобальные статистические характеристики каждого канала, такие как среднее значение, дисперсия, медиана, мода, квантиль и т. д. для каждого канала.

# - 以均值为例

def get_average_color(img):
    path = img 
    img = cv2.imread(path)
    average_color = [img[:, :, i].mean() for i in range(img.shape[-1])]
    return average_color

df['average_color'] = df['image'].apply(get_average_color)
df['average_red']   = df['average_color'].apply(lambda x: x[0]) / 255
df['average_green'] = df['average_color'].apply(lambda x: x[1]) / 255
df['average_blue']  = df['average_color'].apply(lambda x: x[2]) / 255
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. Размытые черты изображений

Этот метод взят из статьи «Автофокусировка диатомовых водорослей в микроскопии светлого поля: сравнительное исследование». Автор этой статьи Печ-Пачеко и др. предложил вариант фильтра Лапласа, который можно использовать для оценки размытости изображения. В этом методе один канал изображения свернут с фильтром Лапласа. Если указанное значение меньше порога, изображение размыто, в противном случае — нет.

def get_blurrness_score(image):
    path =  image 
    image = cv2.imread(path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    fm = cv2.Laplacian(image, cv2.CV_64F).var()
    return fm

df['blurrness'] = df['image'].apply(get_blurrness_score)
df[['image','blurrness']].head(5)
  image blurrness
0 ./imgs/chapter7/img_example.jpeg 475.782864


图片

图片

9. Особенности гистограммы изображения

Сгруппируйте все пиксели в изображении и подсчитайте количество пикселей в каждой гистограмме.Примечание: во многих случаях размер изображения отличается, поэтому обычно лучше использовать процентную функцию.

图片

Иногда мы будем выбирать большее количество бинов.Чтобы добавить новые функции в модель, мы будем выполнять операции уменьшения размерности, такие как PCA или SVD, для функций.

def get_histogram_features(image):
    path =  image 
    image = cv2.imread(path) 
    print(image.ravel().shape)
    hist, bins  = np.histogram(image.ravel(), bins=50)
     
    return hist / image.ravel().shape

hist = df['image'].apply(get_histogram_features)
hist[0]
(3499200,)
array([0.0054261 , 0.01778464, 0.02784208, 0.02863769, 0.01264546,
       0.01067358, 0.01119999, 0.00853052, 0.01141918, 0.0114409 ,
       0.01528206, 0.0153698 , 0.01494227, 0.01478738, 0.01672297,
       0.01708791, 0.02324588, 0.02150692, 0.02266575, 0.02503229,
       0.0280487 , 0.02289752, 0.02528178, 0.02137889, 0.02387231,
       0.02164495, 0.02553927, 0.02519462, 0.02330447, 0.02359082,
       0.02976452, 0.02889003, 0.03554155, 0.04038637, 0.03270405,
       0.02817644, 0.02875229, 0.0253618 , 0.02177298, 0.02141518,
       0.02612597, 0.01889403, 0.01441044, 0.01199503, 0.01037809,
       0.00855738, 0.01004915, 0.01521205, 0.00871342, 0.00990255])