"Моніторинг" зображення


9

Проблема:

Цей виклик випливає з реальної проблеми, яку я мав. У мене є робота подвійного монітора на роботі, і я хотів використати таке зображення як шпалери:

Ідеальний образ

Однак у моїх моніторів є досить значні рамки, і коли я встановлюю свій фон, це виглядає приблизно так, де з'являється пірс (appiers?), Який буде зламаний:

Зображення випуску

Мені вдалося вирішити це, зробивши зображення з вирізаним з нього центром, а потім розтягнувши його до початкового розміру, як на зображенні нижче:

Зображення виклику


Змагання:

Напишіть програму, яка знімає зображення та "контролює" його для використання з подвійним налаштуванням монітора (тобто видаляє центральну частину зображення, де розташовані рамки). Правила такі:

  1. Це повинна бути повна програма, яка приймає зображення або як шлях (аргумент рядка тощо), або у формі діалогового вікна вибору файлів.
  2. Програма повинна приймати як вхід кількість вертикальних ліній (один піксель в ширину), щоб вирізати з центру зображення
  3. Обрізка повинна відбуватися від центру (по ширині) оригінального зображення
  4. Отримане зображення слід змінити масштаб назад до початкового розміру вхідного зображення. (Або половинки можна масштабувати окремо, і потім об'єднувати, або з’єднувати, а потім масштабувати. Масштабування індивідуально створює кращий образ / ефект, але навряд чи це помітно в реальному світі)
  5. Фонові зображення, як правило, рівні, тому для полегшення цього завдання вхідні зображення матимуть лише парну кількість пікселів, а кількість рядків для видалення буде рівним.
  6. Ця проблема - код з гольфом - найкоротший код в байтах

Щасти!


2
1. З малюнків не дуже ясно, що це за операція, оскільки вони масштабуються на однакову ширину. Можливо, замініть перше та останнє зображеннями такого ж розміру, що й середнє та оббиті білим кольором? 2. Чи можемо ми використовувати будь-яку форму масштабування (лінійна, мабуть, найдешевша) або вона повинна бути специфічною (наприклад, кубічна, синхронна тощо)?
Пітер Тейлор

@PeterTaylor Згідно з правилом 3, вхідні та вихідні зображення повинні бути однакової ширини. Будь-яка половина розміру змінюється до половини початкової ширини, а потім з'єднується, або обрізані половинки з'єднуються, а потім зменшуються до початкового розміру. І так, будь-яке масштабування добре.
dberm22

Речення, що починається "Можливо", було пропозицією щодо того, як зробити питання простішим для розуміння, а не запропонованим тлумаченням виклику. Я змінив сам.
Пітер Тейлор

@PeterTaylor Ага, я бачу, це робить зрозумілішим. Дякую.
dberm22

Чи можна припустити, що зображення буде орієнтоване на пейзаж?
Скотт Мілнер

Відповіді:


1

Октава, 85 байт

@(f,n)imsave(imresize((o=imread(f))(:,[1:(end-n)/2,(end+n)/2:end],:),size(o)(1:2)),f)

Визначає анонімну функцію з fназвою файла та nкількістю стовпців, які потрібно видалити. Оскільки анонімна функція вимагає одного виразу, використовується вбудоване призначення, функція, відсутня в MATLAB.

MATLAB, 98 байт

Як бонус, я також пограв у відповідь, сумісний з MATLAB. Цікаво, що на це лише 13 байт довше, оскільки для правильного розбору вбудованих завдань версії Octave потрібна велика кількість дужок.

function  m(f,n)
o=imread(f);imsave(imresize(o(:,[1:(end-n)/2,(end+n)/2:end],:),size(o(:,:,1))),f)

5

Matlab 2013, 150 байт

Ось моя спроба в Матлабі. Однозначно, це не найкоротший код, але це початок.

Попередження, це перезаписує оригінальне зображення, тому спершу зробіть копію.

Версія для гольфу

function  mi(f,n)
o=imread(f);
s=size(o);
imwrite([imresize(o(:,1:((s(2)-n)/2),:),[s(1),s(2)/2]) imresize(o(:,((s(2)+n)/2):end,:),[s(1),s(2)/2])], f);
end

Ungolfed Code з поліпшеннями для непарних розмірів зображення та непарної кількості стовпців

function  monitorizeImage( filename, num_columns )

orig = imread(filename);
orig_size = size(orig);

f = factor(orig_size(2));
origsize_iseven = f(1)==2;

f = factor(num_columns);
num_columns_iseven = f(1)==2;

odd_even_size_mismatch = xor(origsize_iseven,num_columns_iseven);

img_resized = imresize(orig,[orig_size(1) orig_size(2)+odd_even_size_mismatch]);

leftimg = img_resized(:,1:((orig_size(2)+odd_even_size_mismatch-num_columns)/2),:);
leftimg = imresize(leftimg,[orig_size(1),floor(orig_size(2)/2)]);
rightimg = img_resized(:,((orig_size(2)-odd_even_size_mismatch+num_columns)/2):end,:);
rightimg = imresize(rightimg,[orig_size(1),floor(orig_size(2)/2)]);

monitorized_image = [leftimg rightimg];
monitorized_image = imresize(monitorized_image,[orig_size(1),orig_size(2)+ ~origsize_iseven]);

[~, ~, ext] = fileparts(filename); 

imwrite(monitorized_image,strcat(filename(1:end-length(ext)),'_',num2str(num_columns),ext));

end

Просто додавши до цього: відповіді на виклики повинні зробити серйозну спробу оптимізації за даним критерієм оцінки. У проблемі з кодовим гольфом, як ця, це означає, що будь-які очевидні поліпшення, які б зменшили довжину коду, повинні бути внесені

Спробуйте видалити невикористані пробіли та пробіли.
dkudriavtsev

@ ais523 Дякую До 220 байт!
dberm22

Крім того, кожна двобайтова змінна - одна занадто велика. Читання не важливо, тому рефактор osтощо для будь-якої іншої літери в алфавіті! А чому б просто не записати зображення на вхідне зображення, fщоб зберегти ціле strcat? (що, до речі, ви можете замінити, ['',...]а не strcat(...))
Sanchises

@Sanchises Спасибі, це було залишком від неліпшеної / покращеної версії. Ніщо в правилах не зазначало, що воно не може перезаписатись або потрібно мати гарні названі виходи. Дякую ... що зменшилася кількість байтів на 70 байт!
dberm22

3

Мова Вольфрам, 134 , 127 , 119 111 байт

f[i_,c_]:=(d=ImageDimensions@i;ImageAssemble[ImageTake[i,a=All,#]&/@{{0,e=-#&@@d/2-c/2},{-e,a}}]~ImageResize~d)

Створює функцію, fяка сприймає зображення як перший вхід (як символ у Mathematica або Wolfram Cloud), а ціле число - як другий вхід.

Безголівки :

f[image_,columns_]:=(  (*Define Function*)
    d=ImageDimensions[image];  (*Get image dimensions*)
    e=d[[1]]/2+columns/2;  (*Add half the image width to half the number of removed columns*)
    ImageResize[ImageAssemble[Map[ImageTake[i,All,#]&,{{0,-e},{e,All}}]],d]  (*Map the function onto a list with the desired column ranges and merge and scale the resulting image*)
)

Технічно він не буде працювати належним чином, якщо будь-який із розмірів зображення перевищує 362 880 пікселів, але я вважаю, що це нормально, оскільки це поза межами проблеми (і деяких комп'ютерів). Виправлено!


2

PHP, 206 байт

($c=imagecopyresized)($t=imagecreatetruecolor($w=imagesx($s=imagecreatefrompng($argv[1])),$h=imagesy($s)),$s,0,0,0,0,$v=$w/2,$h,$x=$v-$argv[2]/2,$h);$c($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);imagepng($t,$argv[3]);

бере три аргументи командного рядка: ім'я вихідного файлу, кількість рядків для обрізання та ім'я цільового файлу. Бігайте з -r.

Для кращого результату ви можете використовувати imagecopyresampledзамість imagecopyresized(+2 байти).

неозорий

$s=imagecreatefrompng($argv[1]);    # load source image
$w=imagesx($s);$h=imagesy($s);      # get image dimensions
$t=imagecreatetruecolor($w,$h);     # create target image
$v=$w/2;                            # $v = half width
$x=$v-$argv[2]/2;                   # $x = width of remaining halves
                                    # resize and copy halves:
imagecopyresized($t,$s, 0,0,    0,0,$v,$h,$x,$h);
imagecopyresized($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);
imagepng($t,$argv[3]);              # save target image

Я міг би зберегти ще 9 байт, надіславши результат PNG до STDOUT ... але для чого?


"Я міг би зберегти ще 9 байт, надіславши результат PNG до STDOUT ... але для чого?" Тоді ви могли запустити щось на кшталт php -r image.php image.png 1 > output.png, правда?
ʰᵈˑ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.