Giám sát hình ảnh


9

Vấn đề:

Thử thách này đến từ một vấn đề thực sự tôi đang gặp phải. Tôi có một thiết lập màn hình kép tại nơi làm việc và tôi muốn sử dụng hình ảnh sau đây làm hình nền của mình:

Hình ảnh lý tưởng

Tuy nhiên, màn hình của tôi có các bezels khá đáng kể và khi tôi đặt nền của mình, nó trông giống như thế này, nơi bến tàu xuất hiện (appiers?) Bị phá vỡ:

Vấn đề hình ảnh

Tôi đã có thể giải quyết điều này bằng cách tạo một hình ảnh với tâm cắt ra, và sau đó kéo nó trở lại kích thước ban đầu, như trong hình dưới đây:

Hình ảnh thử thách


Các thách thức:

Viết chương trình lấy hình ảnh và "giám sát" nó để sử dụng với thiết lập màn hình kép (nghĩa là xóa phần giữa của hình ảnh, nơi có các bezels). Luật như sau:

  1. Nó phải là một chương trình đầy đủ chấp nhận hình ảnh, dưới dạng đường dẫn (đối số chuỗi, v.v.) hoặc ở dạng hộp thoại chọn tệp.
  2. Chương trình phải lấy làm đầu vào số lượng đường thẳng đứng (chiều rộng một pixel) để cắt ra từ trung tâm của hình ảnh
  3. Việc cắt xén phải xuất phát từ trung tâm (chiều rộng) của hình ảnh gốc
  4. Hình ảnh kết quả phải được thu nhỏ lại về kích thước ban đầu của hình ảnh đầu vào. (Hoặc các nửa có thể được thu nhỏ riêng lẻ, sau đó ghép hoặc ghép và sau đó thu nhỏ. Chia tỷ lệ riêng lẻ tạo ra hình ảnh / hiệu ứng tốt hơn, nhưng hầu như không đáng chú ý trong thế giới thực)
  5. Hình ảnh nền nhìn chung là chẵn, do đó, để làm cho thử thách này dễ dàng hơn, hình ảnh đầu vào sẽ chỉ có số pixel chẵn và số dòng cần xóa sẽ chỉ đồng đều.
  6. Thử thách này là mã golf - mã ngắn nhất tính bằng byte thắng

Chúc may mắn!


2
1. Không rõ lắm từ hình ảnh hoạt động là gì, bởi vì chúng được thu nhỏ theo cùng chiều rộng. Có lẽ thay thế hình ảnh đầu tiên và cuối cùng bằng hình ảnh có cùng kích thước với hình ảnh ở giữa và được đệm bằng màu trắng? 2. Chúng ta có thể sử dụng bất kỳ hình thức thay đổi kích thước nào (tuyến tính có thể là rẻ nhất) hoặc nó phải là một hình thức cụ thể (ví dụ: khối, chân, v.v.)?
Peter Taylor

@PeterTaylor Theo quy tắc 3, hình ảnh đầu vào và đầu ra được cho là có cùng chiều rộng. Mỗi nửa được thay đổi kích thước thành một nửa chiều rộng ban đầu, sau đó được nối hoặc các nửa được cắt được nối, sau đó thu nhỏ lại kích thước ban đầu. Và vâng, bất kỳ tỷ lệ là tốt.
dberm22

Câu bắt đầu "Có lẽ" là một gợi ý về cách làm cho câu hỏi dễ hiểu hơn, không phải là một cách giải thích cho thử thách. Tôi đã tự thay đổi.
Peter Taylor

@PeterTaylor Ahh, tôi hiểu rồi, điều đó làm cho nó rõ ràng hơn. Cảm ơn.
dberm22

Chúng ta có thể giả định rằng hình ảnh sẽ được định hướng cảnh quan?
Scott Milner

Câu trả lời:


1

Octave, 85 byte

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

Xác định hàm ẩn danh với ftên tệp và nsố lượng cột cần xóa. Do một hàm ẩn danh yêu cầu một biểu thức, nên gán nội tuyến được sử dụng, một tính năng không có trong MATLAB.

MATLAB, 98 byte

Như một phần thưởng, tôi cũng đã đánh một câu trả lời tương thích MATLAB. Thật thú vị, điều này chỉ dài hơn 13 byte, vì phiên bản Octave cần rất nhiều dấu ngoặc đơn để phân tích chính xác các bài tập nội tuyến.

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 byte

Đây là nỗ lực của tôi trong Matlab. Chắc chắn sẽ không phải là mã ngắn nhất, nhưng đó là một sự khởi đầu.

Cảnh báo, điều này ghi đè lên hình ảnh gốc, vì vậy hãy tạo một bản sao trước.

Phiên bản chơi gôn

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

Mã Ungolfed, với các cải tiến cho kích thước hình ảnh lẻ và số cột lẻ

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

Chỉ cần thêm vào điều này: câu trả lời cho các thách thức phải thực hiện một nỗ lực nghiêm túc trong việc tối ưu hóa cho tiêu chí chấm điểm nhất định. Trong một thử thách chơi gôn như thế này, điều đó có nghĩa là bất kỳ cải tiến rõ ràng nào sẽ làm giảm độ dài của mã phải được thực hiện.

Hãy thử loại bỏ không gian và khoảng trắng không sử dụng.
dkudriavtsev

@ ais523 Cảm ơn. Xuống tới 220 byte!
dberm22

Ngoài ra, mỗi biến hai byte là một quá nhiều. Khả năng đọc không quan trọng, do đó, refactor osvv cho bất kỳ chữ cái nào khác trong bảng chữ cái! Và tại sao không chỉ ghi lại hình ảnh vào hình ảnh đầu vào fđể lưu toàn bộ strcat? (trong đó, tình cờ, bạn có thể thay thế bằng ['',...]thay vì strcat(...))
Sanchises

@Sanchises Cảm ơn, đó là một phần còn lại từ phiên bản chưa được chỉnh sửa / cải tiến. Không có gì trong các quy tắc nói rằng nó không thể ghi đè lên, hoặc cần có các đầu ra được đặt tên đẹp. Cảm ơn ... đã giảm số byte bằng 70 byte!
dberm22

3

Ngôn ngữ Wolfram, 134 , 127 , 119 111 byte

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

Tạo một hàm flấy một hình ảnh làm đầu vào đầu tiên (làm biểu tượng trong Mathicala hoặc Wolfram Cloud) và một số nguyên làm đầu vào thứ hai.

Ung dung :

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*)
)

Về mặt kỹ thuật, nó sẽ không hoạt động chính xác nếu một trong hai kích thước hình ảnh vượt quá 362.880 pixel, nhưng tôi cho rằng điều đó không sao, vì đó là cách nằm ngoài phạm vi của vấn đề (và một số máy tính). Đã sửa!


2

PHP, 206 byte

($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]);

nhận ba đối số dòng lệnh: tên tệp nguồn, số dòng để cắt và tên tệp đích. Chạy với-r .

Bạn có thể muốn sử dụng imagecopyresampledthay vì imagecopyresized(+2 byte) để có kết quả tốt hơn.

vô dụng

$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

Tôi có thể lưu thêm 9 byte bằng cách gửi kết quả PNG tới STDOUT ... nhưng để làm gì?


"Tôi có thể lưu thêm 9 byte bằng cách gửi kết quả PNG đến STDOUT ... nhưng để làm gì?" Sau đó, bạn có thể chạy một cái gì đó như php -r image.php image.png 1 > output.png, phải không?
ʰᵈˑ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.