このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes).