Bagaimana saya bisa menghapus bayangan dari suatu gambar?

17

Saya punya gambar ini

masukkan deskripsi gambar di sini

Saya ingin menghapus bayangan dari gambar. Saya tahu banyak metode yang berbeda seperti operasi morfologis tertentu telah digunakan untuk menghilangkan bayangan:

Saya telah membuat topeng ini untuk gambar yang sama

masukkan deskripsi gambar di sini

Apakah ada beberapa metode lain yang bisa saya coba menggunakan topeng ini yang telah saya buat?

EDIT :

masukan gambar dan topeng dengan ukuran yang sama seperti yang diminta:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

EDIT 2: saya menghasilkan gambar invarian 1D namun tidak sempurna

  I = imread('shadow.jpg');
       J = im2double(I);

      R = J(:,:,1);
      G = J(:,:,2);
      B = J(:,:,3);

     [len,wid] = size(R);

     % Generation of 2-D Log Chromaticity Image.
     for i = 1:len
        for j = 1:wid
           if ((R(i,j)*G(i,j)*B(i,j))~= 0)
              c1(i,j) = R(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c2(i,j) = G(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c3(i,j) = B(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
           else
              c1(i,j) = 1;
              c2(i,j) = 1;
              c3(i,j) = 1;
        end
    end
end

rho1 = mat2gray(log(c1));
rho2 = mat2gray(log(c2));
rho3 = mat2gray(log(c3));

X1 = mat2gray(rho1*1/(sqrt(2)) - rho2*1/(sqrt(2)));                                         %(1/sqrt(2); -1/sqrt(2); 0)
X2 = mat2gray(rho1*1/(sqrt(6)) + rho2*1/(sqrt(6)) - rho3*2/(sqrt(6)));   %(1/sqrt(6); 1/sqrt(6); -2/sqrt(6))

theta = 120;

InvariantImage = cos(theta*pi/180)*X1 + sin(theta*pi/180)*X2;
imagesc(InvariantImage); colormap(gray)

masukkan deskripsi gambar di sini

Tidak dapat mengerti apa yang saya lakukan salah di sini tolong bantu?

vini
sumber
Pertanyaan bagus! Sudahkah Anda mencoba meningkatkan kecerahan di wilayah bertopeng?
Dima
5
Periksa jawaban saya di sini: dsp.stackexchange.com/questions/454/…
datageist
Secara sederhana, reflektifitas dari dua permukaan yang berbeda berbeda, baik secara absolut dan bagaimana mereka memantulkan cahaya langsung vs tidak langsung. Jadi mereka merespons secara berbeda untuk berada dalam bayangan dan membutuhkan formula yang berbeda untuk membatalkan bayangan.
Daniel R Hicks
Ada metode lain seperti deteksi tepi menggunakan turunan kedua, menggunakan gradien, dan operator Laplacian.
1
Pertanyaan terkait: Mathematica.stackexchange.com/questions/7414/…
Niki Estner

Jawaban:

11

Ada lusinan publikasi yang berurusan dengan deteksi bayangan, membuat topeng-bayangan, dan bahkan beberapa yang benar-benar menghilangkan bayangan - seperti yang disebutkan dalam posting sebelumnya. Saya bisa menambahkan beberapa ke daftar, jika perlu. Masalahnya, bagaimanapun, IMHO masih jauh dari terpecahkan. Untuk memulai cepat, diberi topeng-bayangan, saya sarankan (dan telah mencoba di masa lalu) dua pendekatan berikut. Mereka pasti mengurangi bayangan - tidak selalu mulus, dan saya yakin ada publikasi (bukan oleh saya) yang berurusan dengan penghapusan bayangan dengan cara yang sama.

  • Teknik Manipulasi Domain Gradient seperti dijelaskan di sini (C dan Kode Matlab disediakan): http://www.umiacs.umd.edu/ ~ aagrawal/ICCV2007Course/ index.html Pendekatan integrasi gradien dapat digunakan untuk sejumlah pemrosesan gambar masalah, lihat slide / presentasi untuk contoh lebih lanjut.

    Gagasan umum:

    1. Hitung turunan spasial (gambar gradien) untuk semua saluran warna.
    2. Gunakan batas-bayangan dari topeng-bayangan untuk menghasilkan topeng-berat yang mendekati nol pada batas-bayangan dan meningkat menjadi satu di dalam lingkungan tertentu di sepanjang tepi-bayangan, yaitu ortogonal ke titik tepi tertentu.
    3. Lipat gandakan bobot-topeng dari (2.) dengan semua gambar-gradien untuk mengurangi / membasahi batas bayangan / tepi.
    4. Integrasikan gambar gradien menggunakan kode dari tautan di atas.
    5. Untuk gambar RGB, dari pengalaman saya, menghitung rata-rata saluran terpisah dari gambar asli, dan skala gambar terintegrasi untuk mencocokkan nilai-nilai ini untuk mencegah artefak warna "lucu".
  • Manipulasi kecerahan dalam domain gambar asli.

    1. Gunakan shadow-mask untuk menghasilkan weight-mask yang merupakan salah satu wilayah bayangan luar, memiliki transisi yang mulus (ke atas) melintasi batas bayangan dan faktor skala yang lebih besar dari dalam wilayah bayangan. Seperti yang disarankan dalam posting sebelumnya, faktor skala dapat diperkirakan dari area yang mengelilingi area bayangan menggunakan rata-rata kecerahan bersama dengan kecerahan rata-rata wilayah bayangan.
    2. Lipat gandakan gambar asli (per saluran) dengan mask-berat, tergantung kliping.

Saya juga telah mencoba menggunakan model warna yang berbeda, misalnya HSV, yang menghadirkan pencahayaan atau kecerahan secara langsung, yang kemudian dapat dimodifikasi tanpa tergantung pada warna (rona / saturasi). Ini pada dasarnya bekerja seperti manipulasi kecerahan, yaitu menghasilkan topeng beban yang halus dan melipatgandakannya dengan saluran luminance. Mungkin kedua pendekatan, yaitu integrasi gradien dan manipulasi kecerahan, dapat digabungkan dengan cara yang cerdas, tetapi seseorang mungkin telah mencobanya sebelumnya juga.

Semoga itu bisa membantu, salam hormat, Derik.

Dr.D.
sumber
2
Tautan sepertinya mati, ini versi cache .
Delgan
9

Saya telah melihat gambar ini sebelumnya. Sebenarnya di sini ada di kertas pada topik yang ingin Anda pecahkan. Ditindaklanjuti dengan makalah lain dari kelompok penelitian yang sama di Universitas Simon Fraser. Kedua hal ini akan memberi Anda pengantar yang baik untuk masalah penyelesaian warna untuk pencahayaan invarian.

tiluki
sumber
ya saya tahu itu tetapi sedang mencoba untuk mencoba metode yang berbeda untuk masalah yang sama
vini
@vini: Jika Anda telah membaca bahwa Anda harus tahu apa yang Anda hadapi --- operasi morfologis sederhana tidak akan memotongnya. Apa lagi yang sudah Anda baca dan coba? Saya dapat menyarankan makalah lain jika diperlukan.
Emre
@Emre saya mencoba untuk mengubah kecerahan sehingga efek dari bayangan mengurangi namun tidak terlalu sukses .. Dapatkah sebuah edge map digunakan untuk menutupi bayangan ini .. ya saya pikir operasi morfologis tidak membantu saya mencoba imsubtract (matlab) untuk menghapus bayangan
vini
5
@vini: Masalah ini melampaui solusi satu-liner. Makalah yang ditautkan (dan ada yang lain juga) sudah menyelesaikan masalah dalam banyak kasus, jadi jika Anda ingin melakukan sesuatu yang baru Anda harus menemukan kelemahan mereka, dan itu berarti memahami mereka dengan baik, jadi saya mendorong Anda untuk membacanya kembali. hati-hati. Mereka biasanya menyebutkan masalah di bagian Diskusi dan Kesimpulan. Pendekatan proyeksi log-chromaticity illumination-invariant tampaknya paling menjanjikan bagi saya ...
Emre
4

Ada beberapa metode yang berbicara tentang deteksi Shadow pada dasarnya bekerja dengan latar belakang yang diketahui. Tidak ada gagasan absolut tentang apa itu bayangan hanya dengan melihat warna piksel. Namun, Anda perlu mengidentifikasi bayangan tanpa referensi.

Meskipun masalah ini sulit, berikut ini adalah solusi sepele - meskipun mudah ini mungkin bukan yang terbaik, tetapi bagaimanapun itu mungkin membantu Anda mendapatkan beberapa perspektif.

Mari kita periksa komponen gambar dalam domain HSL

Warnaadalah Hue Component,
Kejenuhanadalah Saturation Component, dan KeringananLightness Component

Diketahui bahwa Lightness sangat terkait dengan padanan warna abu-abu dari gambar dan juga Shadow pada dasarnya

daerah semi-transparan di mana refleksi adegan mengalami redaman lokal.

Dari sini .

Oleh karena itu, overlay yang mengurangi pantulan kata kegelapan Anda dapat mengidentifikasi yang sama di bagian abu-abu dari gambar - tetapi Anda akan menemukan itu saling mempengaruhi jauh lebih sedikit di bagian warna (Hue dan saturasi ke agak).

Sekarang, di sini, saya dapat menghasilkan dua gambar - di mana

  1. Pada gambar pertama ini kami telah menghapus komponen Lightness (diganti dengan nilai rata-rata tetap)
    masukkan deskripsi gambar di sini

  2. Pada gambar kedua kami telah menghapus komponen Saturasi dengan cara yang sama Saturasi Dihapus

Kita dapat melihat bahwa meskipun cahaya dipertahankan tetapi saturasi dihilangkan, informasi penting tentang bayangan tetap utuh - di mana ketika kita menghilangkan cahaya, informasi bayangan akan turun secara signifikan. Meskipun ini tidak sempurna, itu membuat fitur kunci yang memungkinkan Anda untuk membedakan apa sebenarnya bayangan dari latar belakang.

Berdasarkan ini, Anda dapat memperlakukan gambar "Lightness dihapus" sebagai latar belakang dan yang lainnya sebagai gambar insiden dan mengelompokkan gambar berdasarkan dua informasi ini; Jadi di daerah di mana bayangan tidak memainkan peran utama, perbedaannya bisa jauh lebih sedikit, di mana ketika bayangan ada segmen itu akan menunjukkan kesalahan tinggi.

Atau Anda dapat menerapkan segmentasi independen (seperti pertumbuhan wilayah) pada kedua gambar. Gambar yang dihapus saturasi akan memiliki segmen tambahan yang tidak akan ada dalam gambar yang dihapus dengan cahaya yang tidak lain adalah segmen bayangan.

Catatan: Anda dapat membedakan gambar yang dihapus HSL dengan aslinya. Coba juga hal-hal serupa dengan ruang warna HSV dan juga YCbCr.

Dipan Mehta
sumber
2

Anda dapat mengambil histogram dari area bertopeng (bayangan) dan menerapkan transformasi warna linier sehingga histogram dari area bertopeng dan sisa gambar cocok.

Saya kira faktor skala dalam transformasi akan diabaikan, hanya shifing dari kecerahan akan diperlukan, jadi Anda mungkin hanya mengambil kecerahan rata-rata dari dua segmen (bayangan, sorrounding) dan menerapkan perbedaannya.

Libor
sumber