按失真型別分類整理TID2008
對於影象質量評價(IQA)資料庫,TID2008算是不大不小的資料集了。TID2008是由烏克蘭國家航空航天大學的N504訊號接收、傳輸與處理系建立,包括25幅參考影象,1700幅失真影象。失真型別有17種包括:加性高斯噪聲、顏色分量強於照明分量的加性噪聲、空間位置相關噪聲、掩膜噪聲、高頻噪聲、脈衝噪聲、量化噪聲、高斯模糊、影象噪聲、JPEG壓縮、JPEG2000壓縮、JPEG傳輸錯誤、JPEG2000傳輸錯誤、非偏心式噪聲、不同強度的區域性塊失真、強度均值偏移以及對比度變化。該資料庫的DMOS值由838觀察者給出256428個數據統計得到,MOS取值範圍為[0,9]。下載連結如下:
1、將mos_with_names.txt這個資料夾存的內容按失真型別分割,因為它的命名方式是這樣的:
參考影象號,失真型別,失真水平:“iXX_YY_Z.bmp”。
例如,名稱為“i03_08_4.bmp”是指第3個參考影象,第8個型別的失真型別與此失真的4種水平。同樣地,名稱為“i12_10_1.bmp”指這是第12個參考影象,第10個型別的失真與第一種失真水平。“i17.bmp”表示,這是無失真的17個參考影象。
所以做起來也沒那麼複雜,本來想手動的, 每種失真型別建立一個資料夾,資料夾中建立一個txt來儲存資料,首先我手動建立了17個資料夾,以#1到#17命名,確實比較蠢,手動貼上複製了幾個就放棄了,還是寫程式可能要快些。百度之後,修修改改最後的程式碼是這樣的:
%filename = '.\mos_with_names.txt'; %[vale,name] = textread(filename , '%f %s'); clc; clear file = '.\mos_with_names.txt'; fid = fopen(file,'r'); disp(['Reading file: ',file]); linenumber = 0; fid1=fopen('.\#1.txt','wt'); %必須要以wt的方式開啟,不然不能換行 fid2=fopen('.\#2.txt','wt');fid3=fopen('.\#3.txt','wt'); fid4=fopen('.\#4.txt','wt');fid5=fopen('.\#5.txt','wt'); fid6=fopen('.\#6.txt','wt');fid7=fopen('.\#7.txt','wt'); fid8=fopen('.\#8.txt','wt');fid9=fopen('.\#9.txt','wt'); fid10=fopen('.\#10.txt','wt');fid11=fopen('.\#11.txt','wt'); fid12=fopen('.\#12.txt','wt');fid13=fopen('.\#13.txt','wt'); fid14=fopen('.\#14.txt','wt');fid15=fopen('.\#15.txt','wt'); fid16=fopen('.\#16.txt','wt');fid17=fopen('.\#17.txt','wt'); while ~feof(fid) linenumber = linenumber + 1; line = fgetl(fid); if(line(11:14) == '_01_') %disp([num2str(linenumber),':',line]); fprintf(fid1,[line,'\n']); elseif(line(11:14) == '_02_') fprintf(fid2,[line,'\n']); elseif(line(11:14) == '_03_') fprintf(fid3,[line,'\n']); elseif(line(11:14) == '_04_') fprintf(fid4,[line,'\n']); elseif(line(11:14) == '_05_') fprintf(fid5,[line,'\n']); elseif(line(11:14) == '_06_') fprintf(fid6,[line,'\n']); elseif(line(11:14) == '_07_') fprintf(fid7,[line,'\n']); elseif(line(11:14) == '_08_') fprintf(fid8,[line,'\n']); elseif(line(11:14) == '_09_') fprintf(fid9,[line,'\n']); elseif(line(11:14) == '_10_') fprintf(fid10,[line,'\n']); elseif(line(11:14) == '_11_') fprintf(fid11,[line,'\n']); elseif(line(11:14) == '_12_') fprintf(fid12,[line,'\n']); elseif(line(11:14) == '_13_') fprintf(fid13,[line,'\n']); elseif(line(11:14) == '_14_') fprintf(fid14,[line,'\n']); elseif(line(11:14) == '_15_') fprintf(fid15,[line,'\n']); elseif(line(11:14) == '_16_') fprintf(fid16,[line,'\n']); elseif(line(11:14) == '_17_') fprintf(fid17,[line,'\n']); end end fclose(fid1);fclose(fid2);fclose(fid3);fclose(fid4); fclose(fid5);fclose(fid6);fclose(fid7);fclose(fid8); fclose(fid9);fclose(fid10);fclose(fid11);fclose(fid12); fclose(fid13);fclose(fid14);fclose(fid15);fclose(fid16); fclose(fid17);fclose(fid);
這個程式碼比較簡單,很多重複性的程式碼,反正能實現要求也就懶得改了,執行之後在當前資料夾下生成17個txt檔案,每個檔案包含一類失真影象的名字和主觀評分,然後把這些txt手動放到之前建立好的資料夾下就可以了。
2、根據txt中的名字將對應的圖片從distorted_images中提取出來放到對應的失真型別中去,這個工作其實也不算複雜,因為失真資料夾中的文字中已經有該類失真圖片的名字了,直接開啟txt文字取出檔名,根據檔名到distorted_images中讀取圖片,然後儲存到對應的資料夾中,最後再用迴圈把17類圖片都操作了就好了。程式碼如下:
for i =1:17 file = ['.\disimage_fenkai\#',int2str(i),'\#',int2str(i),'.txt']; fid = fopen(file,'r'); disp(['Reading file: ',file]); while ~feof(fid) line = fgetl(fid); filename = line(8:19); %取出圖片名 A=imread(['.\distorted_images\',filename]); %按照圖片名讀取圖片 %mkdir('.\disimage_fenkai\#1\'); imwrite(A,['.\disimage_fenkai\#',int2str(i),'\',filename]); %將圖片按原名字存在#i中 end fclose(fid); end
這個程式可以直接將distorted_images中的失真圖片按照失真型別存到對應的失真資料夾中,方便以後操作。最後的效果如下:
任意開啟一個資料夾,存放的是對應的失真型別,比如開啟#4: