Soru sorGörüntü arka planı değiştirme
bigman tarafından 5 yıl önce soruldu

Arkadaşlar merhaba arka planı tek renk olan ve nesneler içeren bir resmin arka planını yeşil, mavi ve kırmızıya değiştirme işlemini nasıl yapabiliriz ? 

3 Cevap
Caglar Yönetici tarafından 5 yıl önce cevaplandı

Merhaba,
Örnek resim var mı?

bigman tarafından 5 yıl önce cevaplandı

Merhaba Çağlar;
Cevabın için teşekkür ederim. Resim fark etmez düz bir arka plan üstünde sadece tek bir objenin olduğu bir resim.
(https://hizliresim.com/qjJTfL) mesela buradaki resim gibi

Caglar Yönetici tarafından 5 yıl önce cevaplandı

Öncelikle arka planı ayırmanız lazım. Bunun için bildiğim en pratik yol, image segmenter app'i ile denemeler yapmak. Menüden veya imageSegmente komutu ile arayüzü çağırabilirsiniz.
Denemelerinizden memnun olduğunuzda, yaptığınız işlemleri fonksiyon olarak da çıkartabilirsiniz.
Ben örnek resimde sadece "Auto Cluster" ile hemen başarı sağlayabildim. Ancak, silginin üzerindeki açık mavi  bir noktayı da arka plan olarak işaretliyordu. Bunu da "Eroda Mask" isimli "Morphology" filtesi ile çözdüm. Bu filtrelerin teorik arkaplanlarını maalesef bilmiyorum.
Bu yaptığım işlemleri, matlab şu şekilde koda döktü:

function [BW,maskedImage] = segmentImage(RGB)
% Convert RGB image into L*a*b* color space.
X = rgb2lab(RGB);
% Auto clustering
s = rng;
rng('default');
L = imsegkmeans(single(X),2,'NumAttempts',2);
rng(s);
BW = L == 2;
% Erode mask with disk
radius = 3;
decomposition = 0;
se = strel('disk', radius, decomposition);
BW = imerode(BW, se);
% Invert mask
BW = imcomplement(BW);
% Create masked image.
maskedImage = RGB;
maskedImage(repmat(~BW,[1 1 3])) = 1;
end

Fonksiyonu BW isimli çıktısı, 0 ya da 1 olduğunda seçtiğiniz maske yönüne göre, bir pikselin hangi segmente atandığını logical olarak barındırıyor. Ben image segmenter'da invert yaptığım için 0'lar arka planı belirtiyordu. Orijinal resimimizde arka plan olarak belirlenmiş yerlerin rengini kendi belirttiğimiz rgb ile değiştireceğiz. (Bunu büyük ihtimalle döngüsüz yapmak da mümkün ancak ben bulamadım.)
Yani sonuç:

resim = imread("qjJTfL.jpg");
yeni_arkaplan_rgb = [0 255 0]; %yesil
[BW,maskedImage] = segmentImage(resim);
imtool(BW)
imtool(maskedImage)
yeni_resim = resim;
for satir = 1:1:size(BW,1)
for sutun = 1:1:size(BW,2)
if ~BW(satir, sutun)
yeni_resim(satir,sutun,1) = yeni_arkaplan_rgb(1);
yeni_resim(satir,sutun,2) = yeni_arkaplan_rgb(2);
yeni_resim(satir,sutun,3) = yeni_arkaplan_rgb(3);
end
end
end
imtool(yeni_resim)