Çileli bir Girinti Hatası

Yahu şu kodlarla sabahtan beri uğraşıyorum. Girinti hatası yapıyorum, kodlar çalışıyor, ama girinti hatası yüzünden çok geç çalışıyor. Hala hatamı çözemedim, bana yardımcı olabilirseniz sevinirim.

from pylab import *
from PIL import Image

görüntü = array(Image.open(r"jpg_dosyası_yolu\jpgdosyası.jpg").convert("L"))

boşluk = ones((len(görüntü), 20))*255
#iki görüntü arasında dikey beyaz boşluk
boşluk_1 = ones((100,len(görüntü[0])+len(görüntü[0])+20))*255
#yatay boşluk

#İlk olarak Mean_filter fonksiyonu ile görüntüye aritmetik, geometrik ve harmonik
#filtre uygulanacaktır.

def Mean_filter(görüntü1, kernel_boyutu):
    kernel_dizisi = []
    kernel_dizisi_1 = []
    k_i = kernel_boyutu//2
    mean_veri = []
    çarpan = 1

    #Aritmetik(mean_veri), geometrik(geo_maen_veri) ve harmonik(har_mean_veri)
    #0 dizilerine filtreler uygulandıktan sonra kaydedilecektir.
    mean_veri = zeros((len(görüntü), len(görüntü[0])))
    geo_mean_veri = zeros((len(görüntü), len(görüntü[0])))
    har_mean_veri = zeros((len(görüntü), len(görüntü[0])))

    #iç içe for döngüleri aritmatik, geometrik ve harmonik filtlerelerin
    #matematiksel modelleri kullanılarak pikseller tek tek işlenmektedir.

    for i in range(len(görüntü)):
        for j in range(len(görüntü[0])):
            #k_i değişkeni ile görüntüdeki kernel boyutunu tam sayı olarak ikiyi
            #bölündüğü değer kadar görüntünün alt, üst, sağ ve sol
            #piksellerin değerlerinin değiştirmemektedir.

            if(i-k_i<0 or i+k_i>len(görüntü)-1) or (j-k_i<0 or j+k_i>len(görüntü[0])-1):
                mean_veri[i][j] = görüntü[i][j]
                geo_mean_veri[i][j] = görüntü[i][j]
                har_mean_veri[i][j] = görüntü[i][j]
                #aritmetik, geometrik ve harmonik filtrelerin matematiksel modelleri uygulamak için
            else:
                for k in range(kernel_boyutu):
                    for m in range(kernel_boyutu):
                        #Piksel çarpımından oluşan geometrik filtrede Kernel boyutu arttıkça çarpma işlemi
                        #sonucunda elde edilen değerler çok büyüktür. Bu nedenle elde edilen sonuçlar
                        #önce 10'a bölünüp filtreleme işlemleri gerekleştirildikten sonra tekrar 10 ile
                        #çarpılarak normal görüntüye dönüştürülmüştür.
                        kernel_dizisi.append(görüntü[i-k_i+k][j-k_i+m]/10)
                        #Harmonik filtre 1/piksel değeri olarak işlem yapıldığı için eğer piksel değeri
                        #0 olduğunda sonucun 1/0 olarak belirsiz çıkmaması için bu değer 0 alınmıştır
                        if görüntü[i-k_i+k][j-k_i+m]==0:
                            kernel_dizisi_1.append(0)
                        else:
                            kernel_dizisi_1.append(1/görüntü[i-k_i+k][j-k_i+m])
                if len(kernel_dizisi)==kernel_boyutu*kernel_boyutu:
                    #Geometrik filtreleme için denklemde verilen matematiksel işlemler gerçekleştirilmektedir.
                    for b in range(kernel_boyutu*kernel_boyutu):
                        çarpan=abs(çarpan*kernel_dizisi[b])
                        if çarpan<0:
                            çarpan = 0
                    x = kernel_boyutu*kernel_boyutu
                    geo_mean=çarpan**(1/x)
                    geo_mean_veri[i][j] = int(geo_mean*10)
                    #Aritmetik (art_mean) için oluşan kernel dizisinin ortalaması hesaplanmaktadır
                    art_mean=mean(array(kernel_dizisi))
                    mean_veri[i][j]=int(art_mean*10)
                    #Harmonik (har_mean) filtreleme için denklemde verilen matematiksel işlmeler gerçekleştirilmektedir.
                    toplam=sum(kernel_dizisi_1)
                    if toplam==0:
                        har_mean=0
                    else:
                        har_mean=x/toplam
                    har_mean_veri[i][j]=int(har_mean)

                #kernel_dizisi, kernel_dizisi_1 ve çarpan değerleri diğer piksel işlemleri için resetlenmektedir.
                kernel_dizisi = []
                kernel_dizisi_1 = []
                çarpan=1

    return mean_veri, geo_mean_veri, har_mean_veri
art_mean_görüntü, geo_mean_görüntü, har_mean_görüntü = Mean_filter(görüntü, 5)
#fonksiyona git

#orijinal görüntü(görüntü), beyaz boşluk(boşluk), aritmetik filtreleme görüntüsü(art_mean_görüntü) yatay eksende yan yana getirilmiştir.
x=concatenate((görüntü, boşluk, art_mean_görüntü), axis=1)

#Harmonik görüntü(har_mean_görüntü), beyaz boşluk(boşluk), geometrik filtreleme görüntüsü(geo_mean_görüntü) yatay eksende yan yana getirilmiştir.
x1=concatenate((har_mean_görüntü, boşluk, geo_mean_görüntü), axis=1)
x2=vstack((x, boşluk_1,x1))
#x2=x+boşluk+x1 dikey eksende resimler birleştirilmiştir.

img=Image.fromarray(x2)
imshow(img, cmap="gray")
show()```

Örnek jpg dosyasını kendiniz seçebilirsiniz, girinti hatama yardımcı olursanız sevinirim.
Bu kodlar ile jpg dosyalarına aritmatik, harmonik ve geometrik filtreler uyguluyorum. Sırayla 4 görüntü elde ediyorum, bunlardan ilki orijinal görüntü, ikincisi aritmetik filtre, üçüncüsü harmonik, sonuncusu da geometrik filtre olacak.

Umarım girinti hatasını bulursunuz. Kodlar çalışıyor, ama çok uzun sürüyor. Girinti hatam yüzünden, hem uzun sürüyor, hem de orijinal görüntüyü de elde edemiyorum, hatamı bir türlü çözemedim…

Girinti hatalarını, PyCharm gibi girinti hatalarını tespit eden bir ide’de düzeltebilirsiniz.

ya şuan sadece 3 tane ıdle kullanabiliom: IDLE, spyder, vscode.

Girinti hatasının başkaları tarafından tespit edilmesi için başlık açmanız bana biraz tuhaf geldi. Bahsettiğiniz programların böyle bir özelliği yoksa PyCharm’ı kurup hatayı tespit edebilirsiniz.

Nesi tuhaf geldi?
Bir sorunum var, ve çözemedim. Çözebilen, yardımcı olabilen varsa da yardımcı olur.
Bunun nesi tuhaf dostum?
Pycharm’da hatayı nasıl çözeceğim bari onu söyle deneyeyim.

Nesi tuhaf geldi biliyor musunuz?

for i in range(10):
     print("hello")
    print("2")

Yukarıdaki kodda bir girinti hatası var. Ve bu kodların yer aldığı script’i çalıştırdığım zaman yorumlayıcı şöyle bir çıktı üretiyor:

  File "./test.py", line 6
    print("2")
             ^
IndentationError: unindent does not match any outer indentation level

Bu çıktıda gördüğünüz gibi, girinti hatasının hangi satırda yapıldığı zaten açıkça ifade ediliyor.

PyCharm’da hatayı nasıl düzelteceğiniz konusunda PyCharm size bazı işaretler verir, mesela girinti hatası yapılan kısmı sarı renkle renklendirir.

Ayrıca kodlarınızı çalıştırdım ve herhangi bir girinti hatası da almadım, sadece bekliyor, bir işlem de yapmıyor. Girinti hatası olsaydı, şu ana kadar bu hatanın tespit edilmesi gerekirdi. Ki Mean_Filter fonksiyonununun içine (77. satıra) girinti hatası verecek şekilde print("hello") yazdım. Ve hata hemen tespit edildi. Şu an hala paylaştığınız kodlar çalışıyor ama herhangi bir sonuç da göremiyorum.

Edit: Biraz bekledikten sonra şöyle bir görüntü oluştu:

Figure_1

Tek yaptığım kodlarınızı kopyalayıp bir dosyanın içine yapıştırmak ve python ile bu dosyayı çalıştırmak oldu. Hata da vermedi.

Sevgili dostum, ben hata olduğuna eminim, zira oijinal görüntü, yani o dört görüntüden ilki olduğu gibi orijinal görüntünün vermesi gerekiyor, herhangi bir filtre uygulamaması gerekiyor.
Kodların mantığında bir hata olduğunu düşünmüyorum, 2 gündür kontrol ediyorum.
Ama girintilerdeki bir mantıksal hata olabilir(yani “beklenmedik hata” türünde bir hata), "girinti hatası"ndan kastettiğim, pythonun yakalayabileceği bir hata değil, mantıksal bir girinti hatası.

Tabi bu benim tespitim, ama kodlar ve fonksiyonlar çok açık, hatanın sadece girintideki mantıktan olduğunu düşünüyorum.

Özür dilerim, mesajınızı eksik okumuşum.

Önemli değil, özür dilenecek bir şey yok. Umarım çözebilirsin, uğraştığın için teşekkürler.

Kusura bakmayın, görüntü zaten geç gösteriliyor, konu da benim bildiğim bir konu değil. Bir yerde bir değişiklik yapıp sonucunu görmek biraz uzun sürüyor. Konuyu biliyor olsaydım yardımcı olabilirdim.

1 Beğeni

Uyguladığını nereden tespit ettiniz?

Çünkü orijinal görüntü filtre uygulanmış halde geldi. 1. görüntüye filtre uygulamaması lazım, filtre uyguluyor bende.
1.Görüntüye filtre uygulamaması gerekiyor. Sende uygulamadı mı? Denedin mi?

Bunu nasıl tespit ediyorsunuz tam olarak

Çünkü çıktı var elimde hocam, denedim kodları, denemediğim bir kodu neden buraya atayım, istiyorsanız siz de çalıştırın kodları, bir resim dosyasını jpg formatında, yoluyla beraber ilgili koddaki yerine yazın, kodu çalıştırın, göreceksiniz.

Yukarıda arkadaş da denmiş, gördüğün gibi 4 fotodan 1.sine de, yani orijinal olması gerekene de filtre uygulanmış.

Image.open(r"jpg_dosyası_yolu\jpgdosyası.jpg")

Kodun bu kısmına ilgili jpg dosyasını ve yolunu eklerseniz, siz de görürüsünüz.

Çalıştırdım kodu evet,

Bunu soruyordum aslında - fotoğrafa filtre uygulandığını resme bakarak anladığınızı anlıyorum, filtre’den kastınız nedir bu arada? O üç filtreden biri mi? Eğer o üçünden biriyse, ben baktığımda herhangi bir filtre uygulanmadığını görüyorum.

Heh sorun orada, aslında 3 filtre uygulanıyor. Normalde 4 fotoğraf çıktısından, 1. Orijinal Görüntü, 2.Aritmetik Ortalama Filtre Görüntüsü, 3.Harmonik Ortalama Filtre Görüntüsü, 4.Geometrik Ortalama Filtre Görüntüsü
Ama burada bir hata olduğu için meramıma ulaşamıyorum.

Hatadan kastınız, sol üstteki fotoğrafta o 3 filtreden bir veya birkaçının uygulandığı mı? Eğer öyleyse bunu tam olarak nasıl tespit ettiniz, fotoğrafa bakarak mı? Öyleyse, ben sol üstteki fotoğrafa bakıp orijinal fotoğraf ile karşılaştırdığımda herhangi 3 filtreden birinin uygulanmadığını görüyorum.

O da var ya, diğerleri de meçhul. Ama orijinal görüntüde hata olduğuna göre muhtemelen diğerlerinde de hata vardır. Ama o da meçhul biraz. :smiley:

“hata” yok onda onu söyleyebilirim, herhangi 3 filtreden biri uygulanmıyor ona.