Menulis sebuah program yang dibutuhkan dalam standar truecolor gambar dan satu 24-bit RGB warna (tiga angka 0 sampai 255). Ubah gambar input (atau hasilkan gambar baru dengan dimensi yang sama) sedemikian rupa sehingga warna rata - ratanya sama dengan warna tunggal yang dimasukkan. Anda dapat memodifikasi piksel pada gambar input dengan cara apa pun yang Anda inginkan untuk mencapai hal ini, tetapi tujuannya adalah untuk membuat perubahan warna sedapat mungkin tidak terlihat secara visual .
Warna rata - rata gambar RGB sebenarnya adalah satu set dari tiga cara aritmatika , satu untuk setiap saluran warna. Nilai merah rata-rata adalah jumlah dari nilai merah di semua piksel dalam gambar dibagi dengan jumlah total piksel (area gambar), dibulatkan ke bawah ke bilangan bulat terdekat. Rata-rata hijau dan biru dihitung dengan cara yang sama.
Ini Python 2 (dengan PIL ) naskah dapat menghitung warna rata-rata sebagian besar format file gambar:
from PIL import Image
print 'Enter image file'
im = Image.open(raw_input()).convert('RGB')
pixels = im.load()
avg = [0, 0, 0]
for x in range(im.size[0]):
for y in range(im.size[1]):
for i in range(3):
avg[i] += pixels[x, y][i]
print 'The average color is', tuple(c // (im.size[0] * im.size[1]) for c in avg)
(Ada program warna rata-rata serupa di sini , tetapi mereka tidak harus melakukan perhitungan yang persis sama.)
Persyaratan utama untuk program Anda adalah bahwa untuk gambar input apa pun , warna rata-rata output yang sesuai harus benar - benar cocok dengan warna yang dimasukkan - seperti yang dinilai oleh cuplikan Python atau beberapa kode yang setara. Gambar output juga harus memiliki dimensi yang sama persis dengan gambar input.
Jadi, Anda bisa secara teknis mengirimkan program yang hanya mewarnai seluruh input warna rata-rata yang ditentukan (karena rata-rata akan selalu menjadi warna itu), tetapi ini adalah kontes popularitas - pengiriman dengan jumlah suara terbanyak akan menang , dan sepele seperti itu pengiriman tidak akan membuat Anda banyak upvotes. Ide-ide baru seperti memanfaatkan kebiasaan aneh dalam penglihatan manusia, atau mengecilkan gambar dan menggambar batas berwarna di sekitarnya akan (semoga) memberi Anda suara.
Perhatikan bahwa kombinasi warna dan gambar rata-rata tertentu memerlukan perubahan warna yang sangat mencolok. Misalnya, jika warna rata-rata yang cocok adalah hitam (0, 0, 0), gambar input apa pun harus dibuat benar-benar hitam karena jika setiap piksel memiliki nilai bukan nol, mereka akan membuat rata-rata juga bukan nol ( cegah kesalahan pembulatan). Ingatlah batasan seperti itu saat memberikan suara.
Gambar Uji
Beberapa gambar dan warna rata-rata default untuk dimainkan. Klik untuk ukuran penuh.
A. rata-rata (127, 127, 127)
Dari fejesjoco 's Gambar dengan semua warna menjawab . Ditemukan orisinal di blog-nya .
B. rata (62, 71, 73)
Yokohama . Disediakan oleh Geobits .
C. Rata-rata (115, 112, 111)
Tokyo . Disediakan oleh Geobits .
D. rata-rata (154, 151, 154)
Air Terjun Escher . Asli .
E. rata-rata (105, 103, 102)
Gunung Shasta . Disediakan oleh saya.
F. rata-rata (75, 91, 110)
Catatan
- Input dan output format dan tipe file gambar yang tepat yang digunakan program Anda tidak menjadi masalah. Pastikan saja jelas bagaimana menggunakan program Anda.
- Mungkin ide yang bagus (tetapi bukan persyaratan teknis) bahwa jika gambar sudah memiliki warna rata-rata tujuan, itu harus menjadi output apa adanya.
- Silakan memposting gambar uji dengan input warna rata-rata baik (150, 100, 100) atau (75, 91, 110), sehingga pemilih dapat melihat input yang sama di seluruh solusi yang berbeda. (Memposting lebih banyak contoh daripada ini tidak masalah, bahkan dianjurkan.)
sumber
Jawaban:
Python 2 + PIL, penskalaan warna sederhana
Berikut ini adalah pendekatan naif yang harus berfungsi sebagai dasar yang baik. Pada setiap iterasi, kami membandingkan rata-rata kami saat ini dengan rata-rata yang diinginkan, dan skala RGB dari setiap piksel dengan rasio yang sesuai. Kita harus sedikit berhati-hati, karena dua alasan:
Penskalaan 0 masih menghasilkan 0, jadi sebelum kami menskalakan kami menambahkan sesuatu yang kecil (di sini
0.01
)Nilai RGB adalah antara 0 dan 255, jadi kita perlu menyesuaikan rasio yang sesuai untuk menebus fakta bahwa penskalaan piksel yang dibatasi tidak melakukan apa-apa.
Gambar disimpan sebagai PNG karena menyimpan sebagai JPG tampaknya mengacaukan rata-rata warna.
Output sampel
(40, 40, 40)
(150, 100, 100)
(75, 91, 110), palet Starry Night
sumber
C ++, koreksi gamma
Ini melakukan penyesuaian kecerahan gambar menggunakan koreksi gamma sederhana, dengan nilai gamma ditentukan secara terpisah untuk setiap komponen agar sesuai dengan rata-rata target.
Langkah-langkah tingkat tinggi adalah:
Semua input / output gambar menggunakan file PPM di ASCII. Gambar dikonversi dari / ke PNG menggunakan GIMP. Kode dijalankan pada Mac, konversi gambar dilakukan pada Windows.
Kode:
Kode itu sendiri cukup mudah. Satu detail halus tetapi penting adalah bahwa, sementara nilai warna berada dalam kisaran [0, 255], saya memetakannya ke kurva gamma seolah-olah kisarannya adalah [-1, 256]. Ini memungkinkan rata-rata dipaksa ke 0 atau 255. Jika tidak, 0 akan selalu tetap 0, dan 255 akan selalu tetap 255, yang mungkin tidak pernah memungkinkan untuk rata-rata 0/255.
Menggunakan:
.cpp
, misforce.cpp
.c++ -o force -O2 force.cpp
../force input.ppm targetR targetG target >output.ppm
.Contoh output untuk 40, 40, 40
Perhatikan bahwa gambar untuk semua sampel yang lebih besar dimasukkan sebagai JPEG karena mereka melebihi batas ukuran SE sebagai PNG. Karena JPEG adalah format kompresi lossy, mereka mungkin tidak sama persis dengan rata-rata target. Saya memiliki versi PNG dari semua file, yang cocok persis.
Output sampel untuk 150, 100, 100:
Contoh output untuk 75, 91, 110:
sumber
Python 2 + PIL
Ini beralih melalui setiap piksel dalam urutan acak, dan mengurangi jarak antara setiap komponen warna piksel dan
255
atau0
(tergantung pada apakah rata-rata saat ini kurang atau lebih besar dari rata-rata yang diinginkan). Jarak dikurangi oleh faktor multiplikasi tetap. Ini diulangi sampai rata-rata yang diinginkan diperoleh. Pengurangan selalu setidaknya1
, kecuali warnanya255
(atau0
), untuk memastikan bahwa pemrosesan tidak terhenti begitu pikselnya mendekati putih atau hitam.Output sampel
(40, 40, 40)
(150, 100, 100)
(75, 91, 110)
sumber
Jawa
Pendekatan berbasis RNG. Agak lambat untuk gambar input besar.
Tes:
(40,40,40)
(150.100.100)
(75,91.110)
sumber