классифицировать большую коллекцию файлов изображений - PullRequest
0 голосов
/ 20 мая 2019

У меня есть большая коллекция файлов изображений для книги, и издателю нужен список, в котором файлы классифицируются по «типу» (график в оттенках серого, ч / б полутоновое изображение, цветное изображение, рисование линий и т. Д.).В общем, это сложная проблема, но, возможно, я смогу сделать это автоматически, используя инструменты обработки изображений, например ImageMagick с пакетом magick R.

Я думаю, ImageMagick - правильный инструмент, но я недействительно знаю, как использовать его для этой цели.

То, что у меня есть, это просто список цифр и имен файлов фига:

1.1 ch01-intro/fig/alcohol-risk.jpg
1.2 ch01-intro/fig/measels.png
1.3 ch01-intro/fig/numbers.png
1.4 ch01-intro/fig/Lascaux-bull-chamber.jpg
...

Может ли кто-нибудь помочь мне начать?

Редактировать :Вероятно, это был плохо сформулированный или чрезмерно изогнутый вопрос, как было заявлено изначально.Я подумал, что ImageMagick identify или функция R magick::image_info() могут помочь, поэтому, возможно, первоначальный вопрос должен был звучать так: «Как извлечь информацию об изображении из списка файлов [в R]».Я могу изложить это отдельно, если еще не спросил.

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

library(magick)

# initialize an empty array to hold the results of `image_info`
figinfo <- data.frame(
  format=character(),
  width=numeric(),
  height=numeric(),
  colorspace=character(),
  matte=logical(),
  filesize=numeric(),
  density=character(), stringsAsFactors = FALSE
)

for (i in seq_along(files)) {
  img <- image_read(files[i])
  info <- image_info(img)
  figinfo[i,] <- info
}

Я получаю:

> figinfo
  format width height colorspace matte filesize density
1   JPEG   661    733       sRGB FALSE    41884   72x72
2    PNG   838    591       sRGB  TRUE    98276   38x38
3    PNG   990    721       sRGB  TRUE   427253   38x38
4   JPEG   798    219       sRGB FALSE    99845 300x300

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

Edit2 Прежде чем закрыть этот вопрос, был полезен совет по прямому использованию ImageMagick identify.https://imagemagick.org/script/escape.php В частности, %[type] ближе к тому, что мне нужно.Это не раскрывается в magick::image_info(), поэтому мне, возможно, придется написать скрипт оболочки или вызвать system() в цикле.

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

# Get image characteristics via ImageMagick identify
# from: https://imagemagick.org/script/escape.php
#
# -format elements:
# %m image file format
# %f filename
# %[type] image type
# %k number of unique colors
# %h image height in pixels
# %r image class and colorspace

identify -format "%m,%f,%[type],%r,%k,%hx%w" imagefile

>identify -format "%m,%f,%[type],%r,%k,%hx%w" Quipu.png
PNG,Quipu.png,GrayscaleAlpha,DirectClass Gray Matte,16,449x299

Атрибут %[type] ведет меня к тому, что я хочу.

1 Ответ

0 голосов
/ 28 мая 2019

Чтобы закрыть этот вопрос:

В контексте R я успешно использовал system(, intern=TRUE) для этой задачи, как показано ниже, с некоторыми ручными исправлениями

# Use identify directly via system()

# function to run identify for one file
get_info <- function(file) {
  cmd <- 'identify -quiet -format "%f,%m,%[type],%r,%h,%w,%x,%y"'
  info <- system(paste(cmd, file), intern=TRUE)
  unlist(strsplit(info, ","))
}

# This doesn't cause coercion to numeric
figinfo <- data.frame(
  filename=character(),
  format=character(),
  type=character(),
  class=character(),
  height=numeric(),
  width=numeric(),
  xres=numeric(),
  yres=numeric(),
  stringsAsFactors = FALSE
)


for (i in seq_along(files)) {
  info <- get_info(files[i])
  info[4] <- sub("DirectClass ", "", info[4])
 figinfo[i,] <- info
}

figinfo$height <- as.numeric(figinfo$height)
figinfo$width <- as.numeric(figinfo$width)
figinfo$xres=round(as.numeric(figinfo$xres))
figinfo$yres=round(as.numeric(figinfo$yres))

Тогда у меня есть более или менее то, что я хочу:

> str(figinfo)
'data.frame':   161 obs. of  8 variables:
 $ filename: chr  "mileyears4.png" "alcohol-risk.jpg" "measels.png" "numbers.png" ...
 $ format  : chr  "PNG" "JPEG" "PNG" "PNG" ...
 $ type    : chr  "Palette" "TrueColor" "TrueColorAlpha" "TrueColorAlpha" ...
 $ class   : chr  "PseudoClass sRGB " "sRGB " "sRGB Matte" "sRGB Matte" ...
 $ height  : num  500 733 591 721 219 ...
 $ width   : num  720 661 838 990 798 ...
 $ xres    : num  72 72 38 38 300 38 300 38 28 38 ...
 $ yres    : num  72 72 38 38 300 38 300 38 28 38 ...
> 
...