Thu phóng pixel phụ


9

Nhiệm vụ của bạn là lấy một hình ảnh 24 BPP sRGB và xuất ra cùng một hình ảnh được nâng cấp 3x thành các chuỗi con màu đỏ, xanh lục và xanh lam. Hình ảnh thu được sẽ được làm hoàn toàn bằng các pixel đen, đỏ, lục và lam thuần túy.

Mỗi pixel từ hình ảnh nguồn, khi được phóng to, sẽ tạo ra sự sắp xếp gồm 9 pixel phụ có thể bật hoặc tắt (tức là màu tương ứng hoặc màu đen của chúng). Sự sắp xếp cụ thể sử dụng ba cột màu đỏ, xanh lá cây và xanh dương, theo thứ tự đó, như vậy:

Các chuỗi con RGB

(Lưu ý rằng các đường viền trên các "pixel" này chỉ dành cho trình diễn.)

Vì mỗi trong số chín pixel con chỉ có thể bật hoặc tắt, bạn sẽ phải định lượng hình ảnh đầu vào và sử dụng các mẫu pixel con khác nhau để đạt được 3 mức độ sáng.

Đối với mỗi pixel con trong ảnh:

  • Đối với các mức màu 0-74, tất cả các pixel con phải có màu đen.
  • Đối với các mức màu 75-134, pixel phụ ở giữa phải là màu tương ứng và hai màu còn lại phải là màu đen.
  • Đối với các mức màu 135-179, pixel phụ ở giữa phải là màu đen và hai màu còn lại phải là màu tương ứng
  • Đối với các mức màu 180-255, cả ba chuỗi con phải là màu tương ứng của chúng

Tôi đã chọn những phạm vi cấp độ này bởi vì đó là những gì đã xảy ra để trông tốt

Áp dụng phép chuyển đổi này cho mọi pixel trong ảnh và xuất ra ảnh được nâng cấp pixel phụ.

Ví dụ pixel đơn

rgb (40, 130, 175) sẽ tạo ra mẫu này:

00B / 0G0 / 00B

rgb (160, 240, 100) sẽ tạo ra mẫu này:

RG0 / 0GB / RG0

Ví dụ hình ảnh đầy đủ

nàng mô na Li Sa Mona Lisa Subpixels

Đêm đầy sao Subpixels đêm đầy sao

Con vẹt Subpixels vẹt

Hình ảnh có nguồn gốc từ Wikipedia

Quy tắc và ghi chú

  • Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện nào, cho dù đó là các tệp hình ảnh thực tế hoặc danh sách (có thể lồng nhau) của các giá trị RGB.
  • Bạn có thể giả sử các pixel nằm trong không gian màu sRGB với 24BPP.

Chúc bạn chơi golf vui vẻ!


2
Mô tả ban đầu nghe có vẻ như không Bayering. Hóa ra không phải, một phần là do mặt nạ 3x3 độc đáo mà chủ yếu là do lượng tử hóa, nhưng IMO vẫn gần với việc không Bay hơn so với thu phóng pixel (sẽ được nâng cấp bằng một loại phát hiện cạnh nào đó để chống lại bí danh).
Peter Taylor

cảm ơn vì một cuộc trò chuyện thú vị .... cái này có thực sự được sử dụng cho bất cứ điều gì trong cuộc sống thực không?
don sáng

Câu trả lời:


4

JavaScript (Nút, Chrome, Firefox), 111 byte

Định dạng I / O: ma trận các [R,G,B]giá trị.

a=>[...a,...a,...a].map((r,y)=>r.flat().map((_,x)=>a[y/3|0][x/3|0].map(v=>x--%3|511+y%3%2*3104>>v/15&1?0:255)))

Hãy thử trực tuyến! (chỉ một pixel)

Làm sao?

Tất cả các giá trị ngưỡng là bội số của 15. Thay vì thực hiện các kiểm tra so sánh rõ ràng, sẽ ngắn hơn một chút để kiểm tra bitmask trong đó mỗi bit đại diện cho một khoảng 15 giá trị (ngoại trừ bit quan trọng nhất được ánh xạ tới một giá trị).

 bit | range   | top/bottom | middle
-----+---------+------------+--------
  0  |   0- 14 |     off    |   off
  1  |  15- 29 |     off    |   off
  2  |  30- 44 |     off    |   off
  3  |  45- 59 |     off    |   off
  4  |  60- 74 |     off    |   off
  5  |  75- 89 |     off    |    on
  6  |  90-104 |     off    |    on
  7  | 105-119 |     off    |    on
  8  | 120-134 |     off    |    on
  9  | 135-149 |      on    |   off
 10  | 150-164 |      on    |   off
 11  | 165-179 |      on    |   off
 12  | 180-194 |      on    |    on
 13  | 195-209 |      on    |    on
 14  | 210-224 |      on    |    on
 15  | 225-239 |      on    |    on
 16  | 240-254 |      on    |    on
 17  |   255   |      on    |    on

10

Chúng tôi nhận được:

  • 000000000111111111511
  • 0000001110000111113615

Đã bình luận

a =>                      // a[] = input matrix
  [...a, ...a, ...a]      // create a new matrix with 3 times more rows
  .map((r, y) =>          // for each row r[] at position y:
    r.flat()              //   turn [[R,G,B],[R,G,B],...] into [R,G,B,R,G,B,...]
                          //   i.e. create a new list with 3 times more columns
    .map((_, x) =>        //   for each value at position x:
      a[y / 3 | 0]        //     get [R,G,B] from the original matrix
       [x / 3 | 0]        //     for the pixel at position (floor(x/3), floor(y/3))
      .map(v =>           //     for each component v:
        x-- % 3 |         //       1) yield a non-zero value if this is not the component
                          //          that we're interested in at this position
        511 +             //       2) use either 511 for top and bottom pixels
        y % 3 % 2 * 3104  //          or 3615 for the middle pixel (y mod 3 = 1)
        >> v / 15         //          divide v by 15
        & 1               //          and test the corresponding bit
        ?                 //       if either of the above tests is truthy:
          0               //         yield 0
        :                 //       else:
          255             //         yield 255
      )                   //     end of map() over RGB components
    )                     //   end of map() over columns
  )                       // end of map() over rows

Thí dụ

Đoạn mã sau xử lý phần đầu của Mona Lisa (64x64). Không hoạt động trên Edge.


3

Thạch , 27 byte

<“⁷KṆ‘‘Ḅœ?Ɗo⁹’)×€"3⁼þ¤)ẎZ)Ẏ

[0,255][r, g, b]

Hãy thử trực tuyến! Ví dụ này đang chụp hai ảnh hai trong đó pixel trên cùng bên trái là pixel ví dụ đầu tiên, pixel trên cùng bên phải là pixel ví dụ thứ hai, pixel dưới cùng bên trái là pixel đen và pixel dưới cùng bên phải là màu trắng pixel.

Làm sao?

<“⁷KṆ‘‘Ḅœ?Ɗo⁹’)×€"3⁼þ¤)ẎZ)Ẏ - Link: list of lists of lists of integers, I
                         )  - for each row, R, in I:
                      )     -   for each pixel, P, in R:
              )             -     for each integer, C, in P:
 “⁷KṆ‘                      -       list of code-page indices = [135,75,180]
<                           -       less than -> [C<135,C<75,C<180] 
          Ɗ                 -       last three links as a monad:
      ‘                     -         increment -> [1+(C<135),1+(C<75),1+(C<180)]
       Ḅ                    -         from binary -> 4*(1+(C<135))+2*(1+(C<75))+1+(C<180)
        œ?                  -         permutation at that index of [C<135,C<75,C<180]
                            -         when all permutations sorted lexicographically
                            -       ... a no-op for all but [0,0,1]->[0,1,0]
            ⁹               -       256
           o                -       logical OR  e.g. [0,1,0]->[256,1,256]
             ’              -       decrement               ->[255,0,255]
                     ¤      -     nilad followed by link(s) as a nilad:
                  3         -       three
                    þ       -       table with: (i.e. [1,2,3] . [1,2,3])
                   ⁼        -         equal?    -> [[1,0,0],[0,1,0],[0,0,1]]
                 "          -     zip with:
                €           -       for each:
               ×            -         multiply
                       Ẏ    -   tighten (reduce with concatenation)
                        Z   -   transpose
                          Ẏ - tighten

tôi đang cố gắng tìm ra nơi nó mã hóa [[1,0,0]. [0,1,0], [0,0,1]] và tôi gặp khó khăn.
don sáng

@donbright 3⁼þ¤thực hiện một sản phẩm ngoài của [1,2,3]=[1,2,3]năng suất [[1=1,2=1,3=1],[2=1,2=2,2=3],[3=1,3=2,3=3]][[1,0,0],[0,1,0],[0,0,1]].
Jonathan Allan

2

Ngôn ngữ Wolfram (Mathicala) , 186 byte

Đầu vào và đầu ra là danh sách các giá trị RGB

(g=#;Flatten[(T=Transpose)@Flatten[T/@{{#,v={0,0,0},v},{v,#2,v},{v,v,#3}}&@@(If[(l=Max@#)<75,v,If[74<l<135,{0,l,0},If[134<l<179,{l,0,l},{l,l,l}]]]&/@#)&/@g[[#]],1]&/@Range[Length@g],1])&

Hãy thử trực tuyến!


Ngôn ngữ Wolfram (Mathicala), 243 byte

mã thứ hai này là một hàm lấy hình ảnh đầu vào và xuất hình ảnh
(tôi không biết tại sao mọi người lại nhầm lẫn trong các bình luận)

Vì vậy, nếu bạn cho ăn img này

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

vào chức năng này

(i=#;Image[Flatten[(T=Transpose)@Flatten[T/@{{#,v={0,0,0},v},{v,#2,v},{v,v,#3}}&@@(If[(l=Max@#)<75,v,If[74<l<135,{0,l,0},If[134<l<179,{l,0,l},{l,l,l}]]]&/@#)&/@ImageData[i,"Byte"][[#]],1]&/@Range[Last@ImageDimensions@i],1],ColorSpace->"RGB"])&


bạn sẽ nhận được đầu ra này

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


2
Điều này sẽ không được tính là một đầu vào mã hóa?
attinat

"Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện nào, cho dù đó là các tệp hình ảnh thực tế ...". Không, ilà một hình ảnh.
J42161217

Tôi đồng ý với @attinat, điều này có vẻ như mã hóa cứng.
Jonathan Frech

Tôi đã thực hiện một số thay đổi và tôi hy vọng rằng mọi thứ đều rõ ràng.
J42161217

1

C # (Trình biên dịch tương tác Visual C #) , 157 byte

n=>{int i=0,j=n[0].Length;for(;;Write(z(0)+",0,0|0,"+z(1)+",0|0,0,"+z(2)+"\n|"[++i%j&1]));int z(int k)=>(((511^i/j%3%2*4064)>>n[i/j/3][i%j][k]/15)&1^1)*255;}

In RGB của đầu ra. Đầu ra là dòng mới tách biệt và không liên kết. Ban đầu, tôi đã sử dụng mặt nạ bit 1khi bật và 0tắt, nhưng sau đó tôi thấy câu trả lời của Arnauld và tôi nhận ra rằng sử dụng 0như bật và 1tắt có thể tiết kiệm byte theo số. Liên kết TIO chứa "hình ảnh" mẫu 4 x 2 pixel.

Hãy thử trực tuyến!


0

APL + THẮNG, 102 byte

Nhắc cho ma trận 2d pixel dưới dạng số nguyên 24 bit như chúng sẽ xuất hiện trong ảnh

((⍴a)⍴,3 3⍴255*⍳3)×a←(3 1×⍴m)⍴∊⍉((1↓⍴m)/⍳↑⍴m)⊂n←(-+⌿n)⊖n←1 0↓0 75 135 180∘.≤,m←(1 3×⍴m)⍴,⍉(3⍴256)⊤,m←⎕

Hãy thử trực tuyến! Lịch sự của Dyalog Classic

Xuất ra ma trận 2d gồm 24 số nguyên của hình ảnh được chuyển đổi. Hầu hết các mã đang xử lý định dạng của đầu vào và đầu ra.

Ví dụ: Chụp ảnh 2 x 2 được tạo thành từ các pixel mẫu

Đầu vào:

2654895 10547300
2654895 10547300

Đầu ra :.

0     0 16581375 255 65025        0
0 65025        0   0 65025 16581375
0     0 16581375 255 65025        0
0     0 16581375 255 65025        0
0 65025        0   0 65025 16581375
0     0 16581375 255 65025        0

0

Rust - 281 byte

fn z(p:Vec<u8>,wh:[usize;2])->Vec<u8>{let mut o=vec![0;wh[0]*wh[1]*27];for m in 0..wh[0]{for n in 0..wh[1]{for i in 1..=3{for j in 0..3{o[m*9+n*wh[0]*27+j*wh[0]*9+i*2]=match p[18+m*3+n*wh[0]*3+3-i]{75..=134=>[0,1,0],135..=179=>[1,0,1],180..=255=>[1,1,1],_=>[0,0,0],}[j]*255;}}}}o}

Dòng này là một chức năng đáp ứng thách thức, tuy nhiên đầu vào của nó thực sự là dữ liệu ở định dạng tệp TGA như được mô tả tại paulbourke.net , cùng với chiều rộng và chiều cao được phân tích trước, tính bằng pixel, của hình ảnh. Nó trả về dữ liệu pixel cho đầu ra, dưới dạng byte, trong một vectơ gấp 9 lần kích thước của dữ liệu pixel đầu vào.

use std::fs::File;use std::io::{Read,Write};fn main(){let mut p=vec![];let mut o=vec![0u8;18];File::open("i.tga").unwrap().read_to_end(&mut p).unwrap();let mut wh=[0;2];let h=|x|p[x] as usize;let g=|x|(3*x/256) as u8;for i in 0..2{wh[i]=h(12+i*2)+256*h(13+i*2);o[12+i*2]=g(wh[i]*256);o[13+i*2]=g(wh[i]);}let mut f=File::create("o.tga").unwrap();o[2]=2;o[16]=24;o.extend(z(p,wh));f.write(&o).unwrap();}

Dòng thứ hai này là hàm main () có thể chuyển đổi tệp đầu vào có tên i.tga thành tệp đầu ra có tên o.tga, bằng cách gọi hàm z từ dòng đầu tiên, mà không cần sử dụng bất kỳ thư viện bên ngoài nào. Nó xử lý phân tích chiều rộng / chiều cao, tạo tiêu đề cho tệp đầu ra và đọc tệp + ghi. Nó sẽ thêm 402 byte nếu thử thách yêu cầu Tệp I / O, với tổng số 683. Nó rất hữu ích để thử nghiệm.

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.