! mozi-koodo: EUC
! 05/11/15版
! アスキーフォーマットのppm画像ファイルの R値、G値、B値それぞれの
! 平均と標準偏差を求める。
! 以下は、GIMPでアスキー形式のppmフォーマットで保存したファイル
! (RGBデータが1行に1個ずつ書き込まれている)からの読み込みに対応させた例
!
        program ppmzeng
       implicit real*8 (a-h, o-z)
       dimension rgb3(3900000),r(3900000),g(3900000),b(3900000),
     & zy(3900000),zi(3900000),zq(3900000)
       character p3*2,mozi*44
          read(*,100) p3
100      format(a2)
           write(*,*) 'マジックナンバー：',p3
          read(*,*) mozi
          read(*,*) m,n
          write(*,*) '幅：',m
          write(*,*) '高さ：',n
           mn=m*n
          read(*,*) max
          write(*,*) '最大値：',max
          do i=1,mn
           read(*,*) rgb3((i-1)*3+1)
           read(*,*) rgb3((i-1)*3+2)
           read(*,*) rgb3((i-1)*3+3)
          end do
!
!  以上がデータ入力
!
        do i=1,mn
          r(i)=rgb3((i-1)*3+1)
          g(i)=rgb3((i-1)*3+2)
          b(i)=rgb3((i-1)*3+3)
       end do
          call heikin(mn,r,ar,sr)
          call heikin(mn,g,ag,sg)
          call heikin(mn,b,ab,sb)
        write(*,*) 'R値の平均=',ar,'（標準偏差：',sr,'）'
        write(*,*) 'G値の平均=',ag,'（標準偏差：',sg,'）'
        write(*,*) 'B値の平均=',ab,'（標準偏差：',sb,'）'
           x=float(max)
        write(*,*) '------------------------------------------'
        write(*,*) '最大値1に正規化'
        write(*,*) 'R値の平均=',ar/x,'（標準偏差：',sr/x,'）'
        write(*,*) 'G値の平均=',ag/x,'（標準偏差：',sg/x,'）'
        write(*,*) 'B値の平均=',ab/x,'（標準偏差：',sb/x,'）'
        write(*,*) '------------------------------------------'
!
! RGB の平均を YIQ に変換
        do i=1,mn
         zy(i)=0.31d0 * r(i) + 0.59d0 * g(i) + 0.11d0 * b(i)
         zi(i)=0.60d0 * r(i) - 0.28d0 * g(i) - 0.32d0 * b(i)
         zq(i)=0.21d0 * r(i) - 0.52d0 * g(i) + 0.31d0 * b(i)
        end do
          call heikin(mn,zy,ay,sy)
          call heikin(mn,zi,ai,si)
          call heikin(mn,zq,aq,sq)
        write(*,*) 'Y値の平均=',ay,'（標準偏差：',sy,'）'
        write(*,*) 'I値の平均=',ai,'（標準偏差：',si,'）'
        write(*,*) 'Q値の平均=',aq,'（標準偏差：',sq,'）'
        write(*,*) '------------------------------------------'
        write(*,*) '最大値1に正規化'
        write(*,*) 'Y値の平均=',ay/x,'（標準偏差：',sy/x,'）'
        write(*,*) 'I値の平均=',ai/x,'（標準偏差：',si/x,'）'
        write(*,*) 'Q値の平均=',aq/x,'（標準偏差：',sq/x,'）'
!
!
          end
!
          subroutine heikin(mn,x,a,s)
       implicit real*8 (a-h, o-z)
       dimension x(mn)
         a=0.d0
         s=0.d0
        do i=1,mn
         a=a+x(i)
        end do
         a=a/float(mn)
        do i=1,mn
         s=s+ ( x(i)-a )**2
        end do
         s=sqrt(s/mn)
        return
        end
!
