이것을 Cubify! 그레이 스케일의 수업… 어… 색… 어…


27

Rubik의 큐브와 멋진 예술에 대한 열렬한 팬이기 때문에 두 가지를 결합하여 정말 멋진 것들을 만들기 위해 노력하고 있습니다. 기본적으로 미니어처 Rubik의 큐브를 해결하여 Rubik의 큐브 아트를 구성 할 때 기본적인 픽셀을 만듭니다. 이러한 예술의 예는 다음 링크를 통해 볼 수 있습니다. http://google.com/search?q=rubik%27s+cube+art

이제이 코드 골프의 목적은 이미지를 입력으로 받아 들여 다음과 같은 방식으로 변환하는 코드를 만드는 것입니다.

이미지는 처음에는 웹에 안전한 회색조 색상으로 축소됩니다. 그 이유는 웹 안전 그레이 스케일 팔레트 (예 : 000000, 333333, 666666, 999999, CCCCCC 및 FFFFFF)를 분리해야하기 때문입니다. 회색조로 변환하는 비색 방법에 대한 알고리즘은 http://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale 에서 영감으로 사용하려는 경우 사용할 수 있습니다.

그런 다음 회색조를 적절한 색상으로 렌더링합니다. 빠르게 분해하려면 000000은 Rubik의 파란색을, 333333은 Rubik의 빨간색을, 666666은 Rubik의 녹색을, 999999는 Rubik의 주황색을, CCCCCC는 Rubik의 노랑을, FFFFFF는 Rubik의 흰색을 나타냅니다.

오히려 결과 코드가 사진의 팔레트에서 Rubik의 색상으로 곧바로 렌더링 될 수 있기를 바랍니다. 웹 안전 그레이 스케일로 변환 한 다음 해당 루빅스 팔레트로 변환하는 2 단계 방법은 프로세스의 논리에 대한 아이디어를 제공하는 것이지만,이 방법이 더 쉬운 경우에는 반드시 그렇게하십시오.

Rubik 팔레트의 실제 RGB 값은 다음과 일치해야합니다.

  • 레드 : # C41E3A
  • 녹색 : # 009E60
  • 블루 : # 0051BA
  • 주황색 : # FF5800
  • 노랑 : # FFD500
  • 화이트 : #FFFFFF

예를 들어, 다음 그림에서 Abraham Lincoln의 머리를 자르고 다음 여기에 이미지 설명을 입력하십시오을 생성하는 알고리즘을 렌더링했습니다.

여기에 이미지 설명을 입력하십시오

그리드는 이미지를 구성하기 위해 각각의 미니어처 Rubik 큐브가 어떻게 구성되어야하는지 볼 수 있도록합니다. 결과 이미지의 실제 크기는 45 픽셀 x 45 픽셀입니다. 즉, (45/3) * (45/3) = 15 * 15 = 225 미니어처 Rubik의 큐브가이 이미지를 만드는 데 사용됩니다. 나는 당신이 결과 이미지를 그리드와 함께 제시하기를 기대하지 않습니다.

이것이 필요한 것입니다 :

  1. 이 알고리즘으로 처리 할 이미지는 x와 y가 3의 배수가되도록 x 픽셀 x 폭 x y 픽셀이어야합니다. 이는 Rubik의 큐브 모자이크의 일부로 렌더링하기 쉽도록 도와줍니다. 이미지가 상당히 큰 경우 처리하기 전에 45 x 45-75 x 75 정도 또는 그 크기로 줄이십시오. 이 크기 조정 구성 요소는 선택 사항입니다.

  2. 모자이크를 만들려면 이미지를 sextacolored Rubik의 큐브 팔레트로 변환해야합니다.

  3. 결과 이미지는 처리 후 유효한 그래픽 파일이어야합니다. 코드의 작동을 증명하려면 미국 대통령 중 한 명 또는 유명한 할리우드 유명인의 이미지와 비교해 코드를 실행하십시오. 예를 들어 이미 에이브 러햄 링컨을 사용 했으므로이 대통령을 더 이상 사용할 수 없습니다. 사전 및 사후 샷을 포함하여 코드를 테스트하는 데 사용한 회장 / 연예인뿐만 아니라 사용한 언어, 바이트 수를 제공해야합니다

  4. 각 출품작에는 테스트 케이스로 고유 한 대통령 / 연예인이 있어야합니다. 중복은받지 않습니다. 이렇게하면 다른 코드 항목을 테스트하는 데 중복 결과가 사용되지 않습니다. 코드가 작동한다고 말하면 매우 좋습니다. 그것을 증명하는 또 다른 것입니다.

5. 가장 짧은 코드가 승리합니다.

나는 이것을 인기 콘테스트로 바꾸고있다. 바이트 수로 경쟁하지 않고 누가 이것을 할 수 있는지를보고 싶다.


4
링크에 의존하는 대신 Rubik RGB 값을 게시물에 추가하면 더 좋을 것이라고 생각합니다.
SztupY

않음 "이미지 픽셀 폭 X Y 픽셀 높아야 처리하는 방법" 이 리사이징 코드의 일부 또는 이미지는 필요한 크기로 전처리 의미?
user2846289

한 면만 구속 할 경우 루빅스 큐브의 불가능한 상태가 있습니까?
Nick T

1
@WallyWest 내 앱 MineCam을 좋아할 것입니다.이 작업을 수행하지만 사각형을 만드는 대신 광산 공예 블록을 사용하며 실시간 iPhone 카메라로 초당 15 회도 수행하므로 전 세계를 광산 공예 우주. itunes.apple.com/us/app/minecam/id675845303?mt=8 (만은 말했다 세계 하하의 씨앗 생성 할 수있는 경우)
알버트 렌쇼

2
@WallyWest : 게으름에 관한 것이 아닙니다. 문제는 인터넷의 나머지 부분이 다운 되더라도 시작하는 데 필요한 모든 정보를 제공해야합니다. 1-2 년 안에 해당 링크가 중단되고 아무도 링크를 업데이트하지 않습니다. 웹 안전 그레이 스케일 색상을 만드는 방법에 대한 충분한 정보를 제공하면 (문제를 해결하는 데 필요하지 않음) #000000 => #0051BA등 의 작은 매핑 테이블을 쉽게 추가 할 수 있습니다 .
SztupY

답변:


16

Imagemagick (108)

버전 : ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27

다음 전화 :

$ 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

여기서 input과은 output입력 및 출력 파일 이름을 수정할 수있다.

-resize와 사이의 문자 만 계산했습니다. #FFF"이것이 잘못되었다고 생각하면 자유롭게 의견을 말하십시오.

나는 Lenna를 이미지로 사용했습니다.

입력:

입력 이미지

산출:

$ 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

생성 된 이미지

확대 된 출력 :

확대 이미지

참고 : imagemagick 문서에 따르면 명령문에 둘 이상의 조건 ​​연산자를 가질 수는 없지만 호출은 여전히 ​​정상적으로 작동하는 것 같습니다. 아마도 이것이 수정되었고 문서가 업데이트되지 않았습니다.

결과 이미지에서 식별을 실행하면 색상이 실제로 잘 표시됩니다.

$ 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
  (...)

Lenna가 적절한 유명 인사로 간주되지 않는다고 생각하면 Bruce Willis는 다음과 같습니다.

브루스 오리지널

브루스 스몰

브루스 라지


+1 나는 당신의 대답이 거의 타의 추종을 불허한다고 생각합니다. 나는 당신이 할리우드 유명 인사 나 미국 대통령 사진을 의심 할 여지없이 여기에 추가 할 것을 제안 할 것입니다 (Lenna를 제거 할 필요는 없습니다. 그렇지 않으면 지루한 일부 사람들은 그 때문에 불평하고 공감할 수 있습니다.
Victor Stafusa

@Victor : Mathematica, Matlab 또는 Octave가이 표현을 쉽게 이길 수 있다고 생각합니다. fx부품 내부의 조건 이 표현력이 더 좋은 언어로 더 압축 될 수 있기 때문입니다. 그리고이 언어들도 기본 이미지 지원 기능을 가지고 있습니다. (imagemagick / gd / etc 등을
가져와

@SztupY 나는 Lenna를 아주 잘 알고있다 ... 나는 그것을 세겠다 ... Bruce Willis와 함께한 좋은 일도 ..
WallyWest

1
Lenna는 귀엽습니다 (r). 쪽으로.
blabla999

작업에 적합한 도구를 사용하는 경우 +1 내가 이해하기에 imagemagick을 사용하는 올바른 방법은 출력 파일보다 옵션보다 이미지를 먼저 호출하는 것입니다.
CousinCocaine

14

매스 매 티카

그레타 가르보 (Greta Garbo)가 등장하는 미국 우표에서 정사각형 지역을 다루겠습니다. 이라고합니다 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]]

함수 f는 3 개의 매개 변수를 취합니다.

  • i 이것은 이미지를 나타냅니다
  • rs래스터 크기
  • m메쉬 라인을 사용해야하는지 여부를 나타내는 부울 변수입니다. 기본 설정은 True입니다.

15, 30, 45 및 75의 래스터 크기 사용 :

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

4 개의 가보

나는 너무 많은 조각으로 Rubrik의 큐브를 만드는 사람을 상상할 수 없습니다! 그럼에도 불구하고 재미있는 운동.


색상으로 놀기

이것은 이전 항목에서 온 것입니다. 코드가 약간 다릅니다. Graphics대신에 사용됩니다 ArrayPlot. 또한 정사각형이 아니더라도 전체 스탬프를 사용합니다.

Rubrik 큐브 색상의 6! = 720 순열이 있습니다.

다음은 상단 행의 중앙 이미지를 표시합니다 (아래 6 개 이미지 설정). 그레이 스케일 값이 가장 어둡고 가장 밝게 배열되면 색상은 {r, gr, b, o, y, w}입니다. 그럼에도 불구하고 다른 변형이 작동합니다.

i 회색조의 원본 이미지입니다.

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 전체 Greta Garbo 스탬프의 원래 회색조 이미지입니다.

Rasterize[garbo,RasterSize->75 이미지를 75 x 75 배열로 래스터 화합니다.

ColorQuantize[<>, 6] 회색조 값을 6 세트로 줄입니다.

ImageData이미지에서 데이터 배열을 검색합니다. 거꾸로 온다.

Reverse 데이터 배열을 뒤집습니다. 따라서 그림이 오른쪽을 향하게합니다.

garboColors 양자화 된 이미지에서 6 개의 그레이 스케일 값이다.

Graphics[Raster 최종 이미지를 표시합니다.

rubrikColors 6 Rubrik 큐브 색상의 RGB 값입니다.

빨강, 녹색, 파랑, 주황, 노랑 및 흰색의 다양한 색상 순열이 제공됩니다.

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};

그리고 코드 :

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]]]}}]

가보


Garbos Galore

다음은 6 개의 Rubrik 큐브 색상을 사용하는 Greta Garbo의 72 개 (720 개 중) 이미지입니다. 일부 이미지는 다른 이미지보다 더 잘 작동합니다.

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

Garbos Galore


그레타, 오 그레타 ... 예상보다 나아 졌어요 @DavidCarraher, 여기에 좋은 일 ...
WallyWest

@WallyWest. 감사. 매우 흥미로운 도전이었습니다.
DavidC

Mathematica가 imagemagick을 이길 것이라고 확신했는데, 더 이상 골프를 칠 수 없습니까? 모든 기능이 필요합니까?
SztupY

1
@SztupY 코드의 절반은 색상을 정확하게 얻는 데 전념합니다. Reverse그림을 거꾸로 남겨두고 제거 할 수는 있지만 다른 기회는 보지 못합니다. Mathematica는 표현 적이지만 큰 단어를 사용합니다. 이미지에 능숙한 사람이 코드 크기를 조금 줄일 수는 있지만 imagemagick 코드를 능가 할 수는 없을 것입니다.
DavidC

1
코드 전체에 일부 불일치가있었습니다. 나는 그들이 사라 졌으면 좋겠다. i원본 이미지를 잡습니다. grRubrik의 녹색을 나타냅니다. g는 그레이 스케일 이미지에 대한 래스터 화 및 양자화 된 이미지 데이터를 지칭한다.
DavidC

6

스몰 토크 (Smalltalk / X), 289139 *

입력 : i; 출력 : 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)]

입력:

여기에 이미지 설명을 입력하십시오

산출:

여기에 이미지 설명을 입력하십시오

크게 하는:

여기에 이미지 설명을 입력하십시오

(모든 젊은이들에게 : 이것은 마돈나가 아닙니다 ;-)

[*] 배율을 75x75 (첫 번째 줄)로 세지 않았습니다. 이미 크기를 입력으로 사용했을 수 있습니다. 그것이 당신과 함께 잘되기를 바랍니다.


내가 흠모 마릴린 먼로 ... 다양한 선택 ... 크기 조정이었다 옵션 기능 ...
WallyWest

4

포스트 스크립트 및 TRUE Rubik 색상! ;-)

글쎄,이 솔루션은 다소 전문적인 영역으로 제한되어 있기 때문에 약간의 주제가 아닙니다. 그러나 "이상한 수의 질문"(실제로 작동하는 것을 생성 할 수 없음)에 대해 많은 좌절을 겪은 후 나는 무언가를 출판하기로 결정했고 이것을 반 완성 된 낙서 더미에서 꺼내어 그것을 표현할 수있게 만들었습니다.

솔루션은이 질문의 첫 번째 개정판이 Pantone (R) 색상이 사용되며 RGB 색상은 근사치라고 명확하게 명시한 사이트 링크로 필요한 색상을 정의한다는 사실을 이용합니다. 그런 다음 진짜 색상을 사용할 수있을 때 왜 근사치를해야한다고 생각 했습니까? -:)

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

이 코드는 예를 들어 저장 rubik.ps한 다음 일반적인 주문을 통해 Ghostscript에 제공됩니다.

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

그런 다음 다음 줄에서 JPG 파일 이름 입력을 기다립니다. 예 :

kelly.jpg

그리고 모든 것이 잘되면 출력을 out.psd파일에 저장 합니다.

입력은 정사각형 RGB JPEG (모든 크기) 여야하며 출력은 별색 채널이있는 PSD입니다. 파일을 보려면 Photoshop이 필요합니다. GS 장치를 psdcmyk다른 것으로 변경하면 사용할 수있는 것이 없습니다. JPEG as input-포스트 스크립트 인터프리터가 데이터 스트림을 직접 디코딩 할 수 있기 때문입니다. 정사각형 모양-프로그램 sqrt이 이미지의 너비 (및 높이)를 찾기 위해 문자열 길이 에 의존하기 때문 입니다.

첫 번째 줄은 출력 이미지 크기 (기본값 75에서 변경 가능)와 색상 팔레트 (색상 및 번호도 변경 가능)를 정의합니다. 다른 것은 하드 코딩되지 않은 것 같습니다.

무슨 일이야? RGB 트리플릿 스트림은 즉석 공식을 사용하여 회색조 값 문자열로 즉시 변환됩니다. 일반적인 8 비트 contone 이미지 사전이 만들어져 5 개의 동일한 이미지를 5 개의 Separation색상 공간 에서 서로 위에 페인트하는 데 사용됩니다 . 요령은 image오퍼레이터를 호출 할 때마다 전달 함수를 적용하는 것 입니다. 예를 들어 노란색 페인트의 경우이 함수는 0.167 .. 0.333 범위의 입력 값에 대해서만 0을, 그렇지 않으면 1을 반환합니다.

입력:

여기에 이미지 설명을 입력하십시오

Photoshop에서 열린 75x75 출력의 스크린 샷, 800 % 확대 :

여기에 이미지 설명을 입력하십시오

그리고 Photoshop 채널 팔레트 :

여기에 이미지 설명을 입력하십시오


1
Grace Kelly 사용에 대한 +1 ... 당신은 나의 완전한 존경을
받습니다

3

기음#

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;
    }
}

3 개의 매개 변수로 실행해야합니다.

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

75최대는 어디 입니까? 너비 / 높이는 d:\test.jpg입력 파일이며 d:\out.png출력 파일입니다.

이 콘테스트의 다양한 이미지에 대한 출력 :

월리 웨스트 슈 투이 1 슈 투이 2 blabla999

내 유명인 :

어량!

산출:

가스 75 Garth 225

그러나 다른 크기 (75x75보다 큰)는 더 나은 이미지를 생성합니다.

150 300

그리고 우리가 대통령을 고수한다면 :

두바 야 294 두바 야 75 두바 야 225

이것이 코드 길이가 더 길기 때문에 코드를 "최소화"하려고하지 않았습니다. 또한 지침에 이미지가 구체적으로 언급되어 있지 않기 때문에 이미지는 높이 (스퀘어)와 동일한 너비이어야한다고 자르지 않았습니다. 내가 할 수 있는지 이미지가 넓은 3 개 픽셀 / 고의 배수인지 확인하지만. 정사각형 이미지를 원하면 정사각형 입력을 사용하십시오 :피. 알고리즘은 최적과 거리가 멀다.

더 많은 사람들 (사람들이 핫 병아리 / 인터넷 영웅을 더 많이 찬양했기 때문에 :피)

카리 바이런 300 카리 바이런 75 카리 바이런 225 호프 300 호프 75 호프 225


3

Brainfuck

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

여기에는 -1이 EOF이고 8 개 이상의 셀이있는 BF 인터프리터 / 컴파일러가 필요합니다. 빨간색 픽셀 중 하나가 255 인 경우 EOF와 0xFF 값이 다를 수 없으므로 조기 중지됩니다. . jitbf를 사용하면 기계의 정수 크기를 가지고 있으며 EOF처럼 -1을 강제하기 위해 이것을 할 수 있습니다

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

렌더링 된 이미지 파일 형식은 전체 RGB PNM 파일 (P6)이며 Gimp의 옵션으로 원시입니다.

녹색 채널 만 사용합니다 (컬러 이미지를 그레이 스케일로 변환하는 여러 가지 방법 중 하나임). 어떤 루빅스 컬러를 사용하고 해당 RBG 컬러를 정확하게 인쇄 할 수있는 스위치를 찾기 위해 0 미만의 값을 줄이지 않고 값을 43만큼 줄입니다.

Hackers (1995) 의 Angelina Jolie의 이미지는 75x75로 축소되어 응용 프로그램으로 처리되었습니다.

안젤리나 졸리 75x75 / 공정한 사용 Rubiks 큐브 색상의 Angelina Jolie 75x75 / 공정한 사용 동일한 크기의 6 배

마찬가지로 원래 크기 만 사용 했습니다 .

처음에는 축소되지 않음 / 공정 사용

그리고 제가 정신적 이니까 여기에 대통령도 있습니다 :

Wikipedia의 Arnold Schwarzenegger CC


그러나 xkcd 는 해커 (1995)
Sylwester

1
이것은 또한 수행합니다 xkcd.com/1247
그늘

1

목표 -C

나는 지난 밤 에이 도전을 보았고와 약간 혼란스러운 시간을 보냈습니다 -[NSArray indexOfObject:inSortedRange:options:usingComparator:].

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

나는 그것을 내 iPad에서 다음과 같이 실행했다.

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

대니 데비 토 대니 DeVito 후

그레이스 켈리 전에 그레이스 켈리 후


1

파이썬

형식 : python rubik.py <input> <max_cubes> <output>.

제안 된 알고리즘을 사용하여 픽셀을 회색조로 변환합니다.

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

입력:

산드로 페르 티니
(출처 : ilmamilio.it )

로 출력 max_cubes = 25:

산드로 페르 티니, 루빅스 1

로 출력 max_cubes = 75:

산드로 페르 티니, 루빅 드 2

로 출력 max_cubes = 225:

산드로 페르 티니, 루빅스 3


흰색이 없습니까? 그리고 가장 어두운 것은 파란색이어야하지만, 지금 볼 수 있듯이 다른 이미지에서도 문제가됩니다.
user2846289

트윗 담아 가기 잘못된 순서로 매핑했습니다. 흰색이 나타나지 않는 것은 FP 정밀도 (1.055-0.055 = 0.9999999999999999) 때문입니다. 어쨌든 원래의 #FFFFFF 값으로 만 표시되므로 흰색으로 하드 코딩해야한다고 생각합니다.
Oberon

화이트에 대해, 제 의견은 0..1 (밝기) 범위가 6 부분으로 나뉘어져 있고 0.83..1.00은 흰색으로 매핑되거나 그렇지 않으면 큐브의 6 가지 색상의 그림을 만드는 데별로 의미가 없습니다 , 그러나 내가 그것을 읽는 방법입니다.
user2846289

@Oberon Pertini를 ​​사용한 재미있는 선택 ... 그는 거의 94 세까지 살았고 ... Python을 사용하여 훌륭한 작업을했으며, 내가 접한 가장 쉬운 언어 중 하나가 아니라는 것을 인정해야합니다!
WallyWest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.