Lập thể này! Một bài học về thang độ xám er er color color er er bất cứ điều gì


27

Là một fan hâm mộ lớn của khối Rubik và nghệ thuật tuyệt vời, tôi đã làm việc kết hợp cả hai lại với nhau để làm một số thứ thực sự tuyệt vời. Về cơ bản giải quyết các khối Rubik thu nhỏ để tạo thành các pixel thô sơ trong sự hình thành nghệ thuật khối của Rubik. Có thể xem các ví dụ về nghệ thuật như vậy qua liên kết này: http://google.com/search?q=rubik%27s+cube+art

Bây giờ, mục đích của Code Golf này là tạo mã chấp nhận hình ảnh làm đầu vào, sau đó chuyển đổi nó theo cách sau:

Hình ảnh ban đầu được giảm xuống thành màu xám an toàn trên web. Lý do đằng sau điều này là vì chúng ta cần cách ly bảng màu xám an toàn trên web (ví dụ 000000, 333333, 666666, 999999, CCCCCC và FFFFFF). Một thuật toán về phương pháp so màu chuyển đổi sang thang độ xám có sẵn tại: http://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale , nếu bạn muốn sử dụng nó làm cảm hứng.

Sau đó, người ta sẽ đưa ra thang độ xám với các màu thích hợp. Để giải quyết nhanh chóng: 000000 sẽ đề cập đến màu xanh của Rubik, 333333 sẽ đề cập đến màu đỏ của Rubik, 666666 sẽ đề cập đến màu xanh của Rubik, 999999 sẽ đề cập đến màu cam của Rubik, CCCCCC sẽ đề cập đến màu vàng của Rubik và FFFFFF sẽ đề cập đến màu trắng của Rubik.

Tôi muốn thay vào đó là mã kết quả của bạn có thể hiển thị từ bảng màu của ảnh thẳng với màu của Rubik. Phương pháp hai giai đoạn từ chuyển đổi sang thang độ xám an toàn trên web và sau đó sang bảng màu Rubik tương ứng chỉ là cung cấp cho bạn ý tưởng về logic đằng sau quy trình, nhưng bằng mọi cách, bạn sẽ dễ dàng thực hiện điều này hơn.

Các giá trị RGB thực tế cho bảng màu của Rubik phải tương ứng như sau:

  • Màu đỏ: # C41E3A
  • Màu xanh lá cây: # 009E60
  • Màu xanh: # 0051BA
  • Cam: # FF5800
  • Màu vàng: # FFD500
  • Trắng: #FFFFFF

Để cho bạn một ví dụ, tôi đã cắt đầu của Abraham Lincoln từ hình ảnh sau : nhập mô tả hình ảnh ở đây, và đưa ra thuật toán để tạo ra các điều sau:

nhập mô tả hình ảnh ở đây

Lưới ở đó để bạn có thể thấy từng khối Rubik thu nhỏ riêng lẻ sẽ phải được cấu hình như thế nào để tạo thành hình ảnh. Kích thước thật của hình ảnh thu được là 45 pixel x 45 pixel, nghĩa là (45/3) * (45/3) = 15 * 15 = 225 khối Rubik thu nhỏ sẽ được sử dụng để tạo hình ảnh này. Tôi không mong đợi bạn trình bày hình ảnh kết quả với một lưới như tôi có.

Vì vậy, đây là những gì cần thiết:

  1. Hình ảnh được xử lý bằng thuật toán này phải có độ rộng x pixel cao bằng y pixel, sao cho x và y là bội số của 3. Điều này nhằm giúp dễ dàng hiển thị như một phần của khối khảm khối Rubik. Nếu hình ảnh của bạn khá lớn, nên giảm hình ảnh xuống khoảng 45 x 45 đến 75 x 75 hoặc ở các kích thước trước khi xử lý. Hãy nhớ rằng, thành phần thay đổi kích thước này là TÙY CHỌN.

  2. Hình ảnh cần phải được chuyển đổi sang bảng khối Rubik sextacolored để tạo ra bức tranh khảm.

  3. Hình ảnh thu được cần phải là một tệp đồ họa hợp lệ sau khi xử lý. Để chứng minh mã của bạn hoạt động, hãy chạy nó dựa trên hình ảnh của một trong những tổng thống của Hợp chủng quốc Hoa Kỳ hoặc một người nổi tiếng Hollywood nổi tiếng. Tôi đã sử dụng Abraham Lincoln trong ví dụ của mình, vì vậy tổng thống này không còn được sử dụng nữa. Đảm bảo rằng bạn cung cấp ngôn ngữ bạn đã sử dụng, số byte cũng như tổng thống / người nổi tiếng được sử dụng để kiểm tra mã của bạn, bao gồm cả trước và sau khi chụp ...

  4. Mỗi mục phải có một chủ tịch / người nổi tiếng duy nhất là trường hợp thử nghiệm của họ. Tôi sẽ không chấp nhận trùng lặp. Điều này sẽ đảm bảo rằng các kết quả trùng lặp không được sử dụng để kiểm tra các mục nhập mã khác nhau. Thật tốt khi nói rằng mã của bạn hoạt động, đó là một điều khác để chứng minh điều đó.

5. Mã ngắn nhất sẽ thắng.

Tôi đang thay đổi điều này thành một cuộc thi phổ biến ... Tôi muốn xem ai có thể làm điều này mà không phải cạnh tranh về số byte ... Vì vậy, tôi sẽ trao giải thưởng này cùng với tiền thưởng sau ngày 28 tháng 2 năm 2014.


4
Tôi nghĩ sẽ tốt hơn nếu bạn thêm các giá trị Rubik RGB vào bài đăng thay vì dựa vào một liên kết.
SztupY

Có phải "hình ảnh được xử lý phải có độ rộng x pixel cao bằng y pixel" có nghĩa là thay đổi kích thước là một phần của mã hoặc hình ảnh đó được xử lý trước theo kích thước yêu cầu?
dùng2846289

Có bất kỳ trạng thái bất khả thi nào của khối Rubik nếu bạn chỉ hạn chế một mặt?
Nick T

1
@WallyWest Bạn sẽ yêu thích ứng dụng MineCam của tôi, nó thực hiện điều này, nhưng thay vì tạo hình vuông, nó sử dụng các khối thủ công của tôi và nó cũng thực hiện 15 lần mỗi giây với camera iPhone thời gian thực, do đó chuyển đổi toàn bộ thế giới xung quanh bạn thành một vũ trụ mỏ thủ công. itunes.apple.com/us/app/minecam/id675845303?mt=8 (Nếu chỉ nó cũng có thể tạo ra một hạt giống cho thế giới nói hahahaha)
Albert Renshaw

2
@WallyWest: không phải về sự lười biếng. Vấn đề sẽ cung cấp cho bạn tất cả thông tin bạn cần để bắt đầu, ngay cả khi phần còn lại của internet bị hỏng. Trong một hoặc hai năm, liên kết đó có thể bị gỡ xuống và không ai sẽ cập nhật liên kết đó. Nếu bạn cung cấp đủ thông tin về cách tạo màu thang độ xám an toàn cho web (không cần thiết để giải quyết vấn đề), bạn có thể dễ dàng thêm một bảng ánh xạ nhỏ, như #000000 => #0051BA, v.v.
SztupY 17/214

Câu trả lời:


16

Tưởng tượng (108)

Phiên bản: ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27

Cuộc gọi sau:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" input output

nơi inputoutputphải được sửa đổi cho tên tệp đầu vào và đầu ra.

Tôi chỉ đếm các ký tự giữa -resize#FFF", nếu bạn nghĩ rằng điều này không hợp lệ, hãy bình luận.

Tôi đã sử dụng Lenna như hình ảnh (cô ấy xuất hiện trong Playboy, và bất cứ ai làm điều đó nên được tính là một người nổi tiếng Hollywood, phải không?)

Đầu vào:

Hình ảnh đầu vào

Đầu ra:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" Lenna.png LennaRubik.png

Tạo hình ảnh

Đầu ra mở rộng:

Hình ảnh mở rộng

Lưu ý: theo tài liệu hình ảnh, bạn không thể có nhiều toán tử có điều kiện trong một câu lệnh, nhưng cuộc gọi dường như vẫn hoạt động tốt, vì vậy có lẽ điều này đã được sửa và tài liệu không được cập nhật.

Chạy xác định trên hình ảnh kết quả (để hiển thị màu sắc thực sự tốt):

$ identify -verbose LennaRubik.png
  (...)   
  Colors: 6
  Histogram:
       338: (  0, 81,186) #0051BA srgb(0,81,186)
      1652: (  0,158, 96) #009E60 srgb(0,158,96)
      1187: (196, 30, 58) #C41E3A srgb(196,30,58)
      1674: (255, 88,  0) #FF5800 srgb(255,88,0)
       706: (255,213,  0) #FFD500 srgb(255,213,0)
        68: (255,255,255) #FFFFFF white
  (...)

Nếu bạn nghĩ Lenna không được coi là một người nổi tiếng thích hợp, thì đây là Bruce Willis:

Bruce gốc

Bruce nhỏ

Bruce Lớn


+1 Tôi nghĩ rằng câu trả lời của bạn gần như không thể đánh bại (hoặc thậm chí là không thể đánh bại). Tôi sẽ chỉ đề nghị bạn chụp một số ảnh không thể nghi ngờ của người nổi tiếng Hollywood hoặc tổng thống Mỹ và thêm vào đây (không cần xóa Lenna, giữ cả hai). Nếu không, một số người nhàm chán có thể phàn nàn và downvote chỉ vì điều đó.
Victor Stafusa

@Victor: Tôi nghĩ Mathicala, Matlab hoặc Octave có thể dễ dàng đánh bại điều này, vì các điều kiện bên trong fxphần có thể được nén hơn nữa trong một ngôn ngữ có tính biểu cảm tốt hơn. Và những ngôn ngữ đó cũng có hỗ trợ hình ảnh gốc (vì vậy không có ký tự nào bị mất bằng cách cần nhập hình ảnh / gd / v.v.)
SztupY

@SztupY Tôi biết rất rõ về Lenna ... Tôi sẽ tính rằng ... Làm việc rất tốt với Bruce Willis nữa ...
WallyWest

1
Lenna thật dễ thương (r). Lên.
blabla999

+1 để sử dụng công cụ phù hợp cho công việc. Theo hiểu biết của tôi, cách đúng đắn để sử dụng hình ảnh là gọi hình ảnh trước, hơn là các tùy chọn, hơn là tệp đầu ra.
CousinCocaine

14

Toán học

Chúng tôi sẽ làm việc với một khu vực hình vuông từ tem Mỹ có Greta Garbo. Nó sẽ được gọi là j.

j

f[i_,rs_,m_:True]:=
Module[{(*rs=rastersize-4*)r={0.77,0.12,0.23},gr={0,0.62,0.38},b={0,0.32,0.73},o={1,0.35,0},y={1,0.84,0},w={1,1,1},
c1={r,gr,b,o,y,w},grayGreta,garboColors},
grayGreta=(*Reverse@*)ImageData[ColorQuantize[Rasterize[i,(*ImageResolution \[Rule]15*)RasterSize->rs+1,ImageSize->rs],6]];
garboColors=Union@Flatten[grayGreta,1];
ArrayPlot[grayGreta/.Thread[garboColors-> RGBColor@@@c1],
Mesh->If[m==True,{rs-1,rs-1},None],MeshStyle->Black]]

Hàm f có 3 tham số:

  • i trong đó đề cập đến hình ảnh
  • rs, kích thước raster
  • m, một biến boolean cho biết có nên sử dụng các đường lưới hay không. (Cài đặt mặc định là True).

Sử dụng kích thước raster của 15, 30, 45 và 75:

GraphicsGrid[{{f[j, 15], f[j, 30]}, {f[j, 45], f[j, 75]}}, ImageSize -> 800]

4 áo choàng

Tôi không thể tưởng tượng bất cứ ai tạo ra một khối Rubrik với rất nhiều mảnh! Bài tập thú vị dù sao.


Chơi xung quanh với màu sắc

Đây là từ một mục trước đó. Mã này hơi khác nhau. Graphicsđược sử dụng thay vì ArrayPlot. Ngoài ra, chúng tôi sử dụng tem đầy đủ mặc dù nó không phải là hình vuông.

Có 6! = 720 hoán vị của các khối Rubrik.

Dưới đây hiển thị hình ảnh trung tâm của hàng trên (đặt 6 hình ảnh bên dưới). Khi các giá trị thang độ xám được sắp xếp từ tối nhất đến sáng nhất, các màu là {r, gr, b, o, y, w}. Các biến thể khác dù sao làm việc.

i là hình ảnh gốc trong thang độ xám.

Graphics[Raster[(g=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]])
/.Thread[Union@Flatten[g,1]-> {{7,1,2},{0,6,4},{0,3,7},{10,4,0},{10,8,0},{10,10,10}}/10]]]

i là hình ảnh thang độ xám gốc của tem Greta Garbo đầy đủ.

Rasterize[garbo,RasterSize->75 rasterize hình ảnh thành một mảng 75 x 75.

ColorQuantize[<>, 6] giảm các giá trị thang độ xám xuống một bộ 6.

ImageDatalấy mảng dữ liệu từ hình ảnh; nó lộn ngược

Reverse lật mảng dữ liệu, do đó hình ảnh, phía bên phải lên.

garboColors là 6 giá trị thang độ xám trong ảnh được lượng tử hóa.

Graphics[Raster hiển thị hình ảnh cuối cùng.

rubrikColors là các giá trị RGB của 6 màu khối Rubrik.

Hoán vị màu khác nhau của đỏ, xanh lá cây, xanh dương, cam, vàng và trắng được đưa ra.

r={0.77,0.12,0.23};gr={0,0.62,0.38};b={0,0.32,0.73};o={1,0.35,0};y={1,0.84,0};w={1,1,1};
c1={r,gr,b,o,y,w};
c2={r,b,gr,o,y,w};
c3={b,r,gr,o,y,w};
c4={gr,b,r,o,y,w};
c5={b,r,gr,y,o,w};

Và mã:

grayGreta=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]];
garboColors=Union@Flatten[grayGreta,1];
Grid[{{i,
Graphics[Raster[grayGreta/.Thread[garboColors-> c1]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c2]]]},
{Graphics[Raster[grayGreta/.Thread[garboColors-> c3]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c4]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c5]]]}}]

áo choàng


Garbos Galore

Dưới đây là 72 (trong số 720) hình ảnh của Greta Garbo sử dụng 6 màu khối Rubrik. Một số hình ảnh hoạt động tốt hơn những hình ảnh khác, bạn có nghĩ vậy không?

GraphicsGrid@Partition[(Graphics[Raster[grayGreta /. Thread[garboColors -> #]]] & 
/@ Take[Permutations[{r, gr, b, o, y, w}, {6}], 72]), 12]

garbos galore


Greta, oh Greta ... Điều này hóa ra tốt hơn tôi mong đợi. @DavidCarraher, làm việc tốt ở đây ...
WallyWest

@WWWest. Cảm ơn. Đó là một thử thách rất thú vị.
DavidC

Tôi đã rất chắc chắn Mathicala sẽ đánh bại fantemagick, điều này có thể được đánh gôn hơn nữa không? Có phải tất cả các chức năng được yêu cầu?
SztupY

1
@SztupY Một nửa mã được dành riêng để có được màu sắc đúng. Reversecó thể bị loại bỏ, để hình ảnh lộn ngược, nhưng tôi không thấy bất kỳ cơ hội nào khác. Mathematica là biểu cảm nhưng sử dụng các từ lớn. Ai đó lão luyện về hình ảnh có thể giảm kích thước mã một chút nhưng tôi nghi ngờ họ có thể đánh bại mã tưởng tượng của bạn.
DavidC

1
Thực sự có một số mâu thuẫn trên toàn bộ mã. Tôi hy vọng họ đã biến mất. igiữ hình ảnh gốc grlà viết tắt của màu xanh lá cây của Rubrik. gđề cập đến dữ liệu hình ảnh rasterized và lượng tử hóa cho hình ảnh thang độ xám.
DavidC

6

Smalltalk (Smalltalk / X), 289 139 *

đầu vào: i; đầu ra: r

r:=i magnifiedTo:75@75.
r colorMapProcessing:[:c||b|b:=c brightness.Color rgbValue:(#(16r0051BA 16rC41E3A 16r009e60 16rff5800 16rFFD500 16rFFFFFF)at:(b*6)ceiling)]

đầu vào:

nhập mô tả hình ảnh ở đây

đầu ra:

nhập mô tả hình ảnh ở đây

mở rộng:

nhập mô tả hình ảnh ở đây

(dành cho tất cả các bạn trẻ: đây không phải là Madonna ;-)

[*] Tôi chưa tính độ phóng đại lên 75x75 (dòng đầu tiên) - có thể đã sử dụng một kích thước đã được thay đổi kích thước làm đầu vào. Hy vọng rằng đó là ok với bạn.


Tôi ngưỡng mộ Marilyn Monroe ... Lựa chọn tuyệt vời ... Thay đổi kích thước là một tính năng tùy chọn ...
WallyWest

4

Postcript, và màu TRUE Rubik! ;-)

Vâng, giải pháp này là một chút lạc đề ở đây, vì nó bị giới hạn trong lĩnh vực hơi chuyên môn cao. Nhưng sau nhiều lần thất vọng với "câu hỏi về số lạ" (không thể tạo ra một cái gì đó thực tế hoạt động), tôi quyết định xuất bản một cái gì đó và vì vậy đã rút nó ra khỏi đống chữ viết nguệch ngoạc của mình và làm cho nó có thể trình bày được.

Giải pháp khai thác thực tế là phiên bản thứ nhất của câu hỏi này xác định màu sắc bắt buộc bằng cách liên kết đến một trang web, trong đó nêu rõ, màu Pantone (R) sẽ được sử dụng và màu RGB chỉ là xấp xỉ. Sau đó tôi nghĩ, tại sao tôi lại làm xấp xỉ, khi tôi có thể làm màu chính hãng? - :)

10 dict begin
/Size 75 def
/Names  [(PMS 012C) (PMS 021C) (PMS 347C)   (PMS 200C)    (PMS 293C)   ] def
/Colors [[0 .16 1 0][0 .65 1 0][1 0 .39 .38][0 .9 .72 .28][1 .56 0 .27]] def
<</PageSize [Size dup]>> setpagedevice
Size dup scale
true setoverprint
(%stdin) (r) file 100 string readline pop 
(r) file <</CloseSource true>>/DCTDecode filter
0 1000000 string 
dup <</CloseTarget true>>/NullEncode filter 
{
    3 index 3 string readstring
    {
        4 -1 roll 1 add 4 1 roll
        {} forall
        0.11 mul exch 0.59 mul add exch 0.3 mul add cvi
        1 index exch write
    } {pop exit} ifelse
} loop
closefile
0 3 -1 roll getinterval
exch closefile
/data exch def
/n data length sqrt cvi def
1 1 Names length {
    /N exch def
    { 
        dup N Names length 1 add div gt 
            {N 1 add Names length 1 add div gt 
                {1} {0} ifelse} 
            {pop 1} 
        ifelse
    } settransfer
    [/Separation Names N 1 sub get /DeviceCMYK {
        Colors N 1 sub get 
        { 1 index mul exch } forall pop
    }] setcolorspace
    <<
        /ImageType        1
        /Width            n
        /Height           n
        /ImageMatrix      [n 0 0 n neg 0 n]
        /BitsPerComponent 8
        /Decode           [0 1]
        /DataSource       data
    >> image
} for
showpage
end

Mã này sẽ được lưu dưới dạng ví dụ rubik.psvà sau đó được đưa vào Ghostscript với câu thần chú thông thường:

gs -q -sDEVICE=psdcmyk -o out.psd rubik.ps

Sau đó, nó chờ bạn trên dòng tiếp theo, để nhập tên tệp JPG, vd

kelly.jpg

và, nếu mọi việc suôn sẻ, lưu kết quả đầu ra vào out.psdtập tin.

Đầu vào phải là JPEG RGB vuông (bất kỳ kích thước nào), đầu ra là PSD với các kênh màu tại chỗ. Bạn sẽ cần Photoshop để xem tập tin. Thay đổi thiết bị GS từ psdcmykbất kỳ thứ gì khác sẽ không tạo ra được gì. JPEG là đầu vào - bởi vì trình thông dịch postcript có thể giải mã trực tiếp luồng dữ liệu từ nó. Hình vuông - bởi vì chương trình dựa vào sqrtđộ dài chuỗi để tìm chiều rộng (và chiều cao) của hình ảnh.

Các dòng đầu tiên xác định kích thước hình ảnh đầu ra (có thể thay đổi từ mặc định 75) và bảng màu (màu sắc và số lượng của chúng cũng có thể được thay đổi). Bất cứ điều gì khác không phải là mã hóa cứng, tôi nghĩ.

Chuyện gì đang xảy ra vậy? Luồng bộ ba RGB được chuyển đổi nhanh chóng thành chuỗi các giá trị thang độ xám (với công thức đơn giản), từ điển hình ảnh contone 8 bit thông thường được xây dựng và sử dụng để vẽ 5 hình ảnh giống hệt nhau lên nhau trong 5 Separationkhông gian màu. Bí quyết là áp dụng các hàm truyền trước mỗi lần gọi imagetoán tử. Ví dụ, đối với sơn màu vàng, hàm này trả về 0 cho các giá trị đầu vào trong 0.167 .. chỉ phạm vi 0.333 và 1 khác.

Đầu vào:

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình của đầu ra 75x75 mở trong Photoshop, được phóng to 800%:

nhập mô tả hình ảnh ở đây

Và bảng màu Photoshop:

nhập mô tả hình ảnh ở đây


1
+1 khi sử dụng Grace Kelly ... bạn hoàn toàn tôn trọng tôi ...
WallyWest

3

C #

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        unchecked
        {
            var t = new[] { 0xFFC41E3A, 0xFF009E60, 0xFF0051BA, 0xFFFF5800, 0xFFFFD500, 0xFFFFFFFF }.Select(v => Color.FromArgb((int)v)).ToArray();
            var o = new Bitmap(Bitmap.FromFile(args[1]));
            var m = double.Parse(args[0]);
            var r = Math.Min(m / o.Width, m / o.Height);
            var w = (int)(o.Width * r);
            var h = (int)(o.Height * r);

            o = new Bitmap(o, w - (w % 3), h - (h % 3));
            for (int y = 0; y < o.Height; y++)
                for (int x = 0; x < o.Width; x++)
                    o.SetPixel(x, y, N(o.GetPixel(x, y), t));
            o.Save(args[2], ImageFormat.Png);
        }
    }

    static Color N(Color c, Color[] t)
    {
        return t.OrderBy(v => Math.Abs(W(v) - W(c))).First();
    }

    static double W(Color c)
    {
        return .11 * c.B + .59 * c.G + .30 * c.R;
    }
}

Bạn cần chạy nó với 3 tham số:

foo.exe 75 d:\test.jpg d:\out.png

Trong trường hợp 75là tối đa. chiều rộng / chiều cao, d:\test.jpglà tệp đầu vào và d:\out.pnglà tệp đầu ra.

Đầu ra cho các hình ảnh khác nhau trong cuộc thi này:

WallyWest 1 SztupY 2 blabla999

Người nổi tiếng của riêng tôi:

Garth!

Đầu ra:

Garth 75 Garth 225

Tuy nhiên, các kích thước khác (lớn hơn 75x75) cho kết quả hình ảnh tốt hơn:

150 300

Và, nếu chúng ta gắn bó với các tổng thống:

DubbaYa 294 DubbaYa 75 DubbaYa 225

Vì đây không phải là (lâu hơn?), Tôi không bận tâm đến việc "thu nhỏ" mã quá nhiều. Ngoài ra, vì các hướng dẫn không đề cập cụ thể đến hình ảnh phải có cùng chiều rộng với chiều cao (hình vuông), tôi không bận tâm đến việc cắt xén; Tôi làm , tuy nhiên, đảm bảo hình ảnh là bội số của 3 pixel rộng / cao. Nếu bạn muốn hình ảnh vuông, sử dụng đầu vào hình vuông : PCuối cùng; thuật toán là xa tối ưu.

Một vài điều nữa (vì mọi người nâng cao gà nóng / anh hùng internet nhiều hơn : P)

Kari Byron 300 Kari Byron 75 Kari Byron 225 Hoff 300 Hoff 75 Hoff 225


3

Brainfuck

++++[->+[,.----------]<]>>>>---->->++++++++++>>------------>+++>+++>--
--->++++++[->+++++<]---->+[-<+++++++<+++<+++++<+++<+++<++++++<++++++<+
<++>>>>>>>>>]<[<]<<,+[,<++++++>[>++++++[->+++++++<]>+[<<[->]>[<]>-]<<<
->]+<[-[-[-[-[[-].>>>>>>>>.<.<<<<<<-<]>[->>>>>[.<]<<]<]>[-.>>>[>]<<<.<
.[<]<<]<]>[--.+>>>[>]<<.[<].<<]<]>[--.+>>>[>]<.[<].<<]<]>[--...+],,+]

Điều này yêu cầu trình thông dịch / trình biên dịch BF có -1 là EOF và có các ô cao hơn 8 bit NẾU một trong các pixel màu đỏ là 255. Nếu không, nó sẽ dừng sớm do không thể khác nhau giữa EOF và giá trị 0xFF . Với jitbf, bạn có bất cứ thứ gì máy có kích thước nguyên và có thể làm điều này để buộc -1 là EOF:

jitbf --eof -1 rubiks.bf < angelina.pnm > angelina-rubix.pnm

Định dạng tệp hình ảnh được hiển thị là tệp RGB PNM đầy đủ (P6), dưới dạng tùy chọn trong Gimp.

Nó chỉ sử dụng kênh màu xanh lá cây (là một trong nhiều cách để chuyển đổi hình ảnh màu thành thang độ xám). Nó giảm giá trị xuống 43 mà không giảm giá trị dưới 0 để tìm ra màu rubik nào sẽ sử dụng và có một công tắc in ra màu RBG chính xác tương ứng.

Hình ảnh của Angelina Jolie từ Hackers (1995) đã giảm xuống 75x75 và được xử lý với ứng dụng:

Angelina Jolie 75x75 / Sử dụng hợp lý Angelina Jolie 75x75 màu Rubiks / Sử dụng hợp lý Cùng tỷ lệ 6x

Tương tự, chỉ có tôi sử dụng kích thước ban đầu :

Tương tự chỉ không thu nhỏ trước / Sử dụng hợp lý

Và vì tôi cũng là một tổng thống:

Arnold Schwarzenegger CC từ Wikipedia


Không có chủ đề, nhưng ngày nay xkcd cũng có các tài liệu tham khảo về Hacker (1995)
Sylwester

1
Cái này cũng có: xkcd.com/1247
Bóng râm

1

Mục tiêu-C

Tôi đã thấy thử thách này đêm qua và có một khoảng thời gian hơi khó hiểu -[NSArray indexOfObject:inSortedRange:options:usingComparator:], do đó sự chậm trễ.

- (UIImage  *)rubiksImage:(UIImage *)inputImg
{
    //Thank you http://stackoverflow.com/a/11687434/1153630 for the greyscale code
    CGRect imageRect = CGRectMake(0, 0, inputImg.size.width, inputImg.size.height);

    int width = imageRect.size.width;
    int height = imageRect.size.height;

    uint32_t *pixels = (uint32_t*)malloc(width * height * sizeof(uint32_t));

    memset(pixels, 0, width * height * sizeof(uint32_t));

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

    CGContextDrawImage(context, imageRect, [inputImg CGImage]);

    const int RED = 1;
    const int GREEN = 2;
    const int BLUE = 3;

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            uint8_t* rgbaPixel = (uint8_t*)&pixels[y * width + x];
            uint32_t grayPixel = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];

            NSArray *r = [self rubixColorFromGrey:grayPixel];

            rgbaPixel[RED] = [r[2] integerValue];
            rgbaPixel[GREEN] = [r[1] integerValue];
            rgbaPixel[BLUE] = [r[0] integerValue];
        }
    }

    CGImageRef newCGImage = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    free(pixels);

    UIImage* newUIImage = [UIImage imageWithCGImage:newCGImage];

    CGImageRelease(newCGImage);

    return newUIImage;
}

- (NSArray *)rubixColorFromGrey:(uint32_t)p
{
    NSArray *colors = @[@0, @51, @102, @153, @204, @255];

    NSUInteger index = [colors indexOfObject:@(p)
                               inSortedRange:NSMakeRange(0, colors.count)
                                     options:NSBinarySearchingInsertionIndex | NSBinarySearchingFirstEqual
                             usingComparator:^(id a, id b) {
                                return [a compare:b];
                             }];
    switch (index) {
        case 0:
            return rgb(0, 81, 186);
            break;
        case 1:
            return rgb(196, 30, 58);
            break;
        case 2:
            return rgb(0, 156, 96);
            break;
        case 3:
            return rgb(255, 82, 0);
            break;
        case 4:
            return rgb(255, 213, 0);
            break;
        case 5:
            return rgb(255, 255, 255);
            break;

        default:
            break;
    }

    return colors; //go wild
}

NSArray *rgb(int r, int g, int b)
{
    return @[@(r), @(g), @(b)];
}

Tôi đã chạy nó trên iPad của mình như vậy:

UIImageView *img = [[UIImageView alloc] initWithImage:[self rubiksImage:[UIImage imageNamed:@"danny.png"]]];
[img setCenter:self.view.center];
[self.view addSubview:img];

Trước Daniel DeVito trước đây Sau Daniel DeVito sau

Trước Grace Kelly trước Sau Grace Kelly sau


1

Con trăn

Định dạng : python rubik.py <input> <max_cubes> <output>.

Che pixel thành thang độ xám bằng thuật toán được đề xuất.

import Image, sys

def rubik(x, max_cubes = 25):

    img = x
    max_cubes *= 3

    if x.size[0] > max_cubes or x.size[1] > max_cubes:

        print "Resizing image...",

        if x.size[0] > x.size[1]:
            img = x.resize((max_cubes, int(max_cubes * float(x.size[1]) / x.size[0])), Image.ANTIALIAS)
        else:
            img = x.resize((int((max_cubes * float(x.size[0]) / x.size[1])), max_cubes), Image.ANTIALIAS)

    if x.size[0] % 3 or x.size[1] % 3:
        print "Sizes aren't multiples of 3"
        return

    print "Image resized to %i x %i pixels" % img.size

    out = Image.new('RGB', img.size)

    print "Converting image...",

    for x in xrange(out.size[0]):
        for y in xrange(out.size[1]):
            r, g, b = img.getpixel((x, y))
            if r == g == b == 255:
                out.putpixel((x,y), (255, 255, 255))
            else:
                l = 0.2126 * r + 0.7152 * g + 0.0722 * b
                l /= 255
                out.putpixel((x,y), (
                        (0x00, 0x51, 0xBA),
                        (0xC4, 0x1E, 0x3A),
                        (0x00, 0x9E, 0x60),
                        (0xFF, 0x58, 0x00),
                        (0xFF, 0xD5, 0x00)
                    )[int(5 * (l <= 0.0031308 and 12.92 * l  or 1.055 * l ** (1/2.4) - 0.055))])

    print "Image converted successfully."

    print "Stats:"
    h, v = img.size[0] / 3, img.size[1] / 3
    print "   ", h, "horiz. Rubik cubes"
    print "   ", v, "vert. Rubik cubes"
    print "   ", h * v, "total Rubik cubes"

    return out.resize((out.size[0], out.size[1]))

if __name__ == "__main__":
    rubik(Image.open(sys.argv[1]).convert("RGB"), int(sys.argv[2])).save(sys.argv[3])

Đầu vào:

Sandro Pertini
(nguồn: ilmamilio.it )

Đầu ra với max_cubes = 25:

Sandro Pertini, Rubik'd 1

Đầu ra với max_cubes = 75:

Sandro Pertini, Rubik'd 2

Đầu ra với max_cubes = 225:

Sandro Pertini, Rubik'd 3


Không thiếu màu trắng? Và màu tối nhất phải là màu xanh lam, nhưng, như tôi thấy bây giờ, đó cũng là vấn đề với một số hình ảnh khác.
dùng2846289

@VAdimiR Rất tiếc! Đánh dấu chúng theo thứ tự sai. Đối với màu trắng không hiển thị, đó là do độ chính xác của FP (1.055 - 0.055 = 0.9999999999999999). Tôi nghĩ rằng tôi sẽ phải mã hóa trắng, điều đó không khó, vì dù sao nó cũng chỉ hiển thị ở giá trị ban đầu là #FFFFFF.
Oberon

Về màu trắng, ý kiến ​​của tôi là phạm vi 0..1 (độ sáng) được chia thành 6 phần và bất kỳ thứ gì 0.83..1.00 được ánh xạ thành màu trắng, hoặc nếu không sẽ không có nhiều ý nghĩa trong việc tạo ra hình ảnh của 6 màu của khối lập phương , nhưng đó là cách tôi đọc nó.
dùng2846289

@Oberon Lựa chọn thú vị khi sử dụng Pertini ... Ông gần như sống đến 94 tuổi ... Và công việc tuyệt vời khi sử dụng Python, và tôi phải thừa nhận, không phải là một trong những ngôn ngữ dễ nhất tôi từng gặp, rất tốt!
WallyWest
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.