особенности изображения
Подобно текстовым функциям, функции изображений также являются типом данных, которые очень трудно добывать с помощью моделей деревьев с градиентным усилением.В настоящее время проблемы, связанные с изображениями, такие как классификация изображений, сегментация изображений и т. д., почти все модели, основанные на нейронные сети.В состоянии задачи, такой как задача поиска и рекомендации продукта, он содержит как информацию изображения, так и текстовую информацию и т. д. В настоящее время схема моделирования, основанная на модели дерева повышения градиента, все еще очень важна. В настоящее время, чтобы лучше использовать всю информацию о данных, нам нужно извлекать функции изображения в нескольких направлениях.
В этом разделе мы познакомим вас с методами и приемами, обычно используемыми при извлечении признаков изображения.
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])