|
 |
|
2017/1/19(Thu) 15:52:25|NO.77980
いつもお世話になります。
画像を白黒にするソフトを作っているのですが1pixずつpget,psetを繰り返しているため
動作が遅いのをなんとかしたく立てさせていただきました。
用途としてはスキャナで読み込んだ文書などのぼやけた部分を消すためなので
モノクロbmpのように白(RGB全て255)か黒(RGB全て0)のどちらかにすることが目的です
repeat imagey
ycnt=cnt
repeat imagex
gsel 2
pget cnt,ycnt
c=ginfo_r/3+ginfo_g/3+ginfo_b/3
gsel 4
if c>2.55*Trackbar:color 255,255,255
if c<=2.55*Trackbar:color 0,0,0
pset cnt,ycnt
loop
loop
この方法を考えてみましたが、画像サイズによりますが
1000*1000以上の画像だと自分のパソコンでは1秒程度固まります。
スペックが高ければ問題ないのかもしれませんが、閾値をトラックバーで変えられるように
しているので動かすたび数秒止まるようでは不便です。
同じような動作をもう少し速く行う方法はありますか?
いい方法があれば教えていただけませんか。
以下スクリプト全て
objsize 100,25
pos 0,0:button "開く" , *open
pos 100,0:button "終了",*endr
stop
*open
dialog "bmp|gif|jpg|jpeg|ico|cur",16
if stat != 0:goto *edit
stop
*endr
end
*edit
chdir dir_exe
filepath=refstr
buffer 2
picload filepath,0
imagex=ginfo(12)
imagey=ginfo(13)
if imagex<imagey{
per=imagey/1000}
if imagey<=imagex{
per=imagex/1000}
if per = 0:per = 1
screen 3,imagex/per,imagey/per
screen 4,imagex,imagey,2
gsel 3
gzoom imagex/per,imagey/per,2,0,0,imagex,imagey
gsel 0
pos 0,25
//Let's HSP!「hsp_object7」を参考にしました
winobj "msctls_trackbar32", "", , $50000000 | $1, 200, 30
TrackbarID = objinfo(stat, 2)
sendmsg TrackbarID, $414, 5
sendmsg TrackbarID, $405, 1, 50
oncmd gosub *scrollbar, $114
wait 100
gosub *main
stop
*scrollbar
if lparam = TrackbarID:sendmsg TrackbarID, $400:Trackbar=stat
gosub *main
return
*main
repeat imagey
ycnt=cnt
repeat imagex
gsel 2
pget cnt,ycnt
c=ginfo_r/3+ginfo_g/3+ginfo_b/3
gsel 4
if c>2.55*Trackbar:color 255,255,255
if c<=2.55*Trackbar:color 0,0,0
pset cnt,ycnt
loop
loop
gsel 3
gzoom imagex/per,imagey/per,4,0,0,imagex,imagey
return

| |
|
2017/1/19(Thu) 17:44:24|NO.77981
pget使うよりはVRAMを操作したほうが早いですよ。
以下はgmode色々使ってほぼ2値化するソースコード。
HSP2.0時代のものなのかわかりませんが関数の修正が必要です。
http://bbshatena1.nazca.co.jp/user1/support/156.html
screen 2:title "Original"
dialog "bmp;*.jpg", 16 : if stat ! 1 : end
sdim fn, 256 : fn = refstr
picload fn
wx2 = ginfo_winx : wy2 = ginfo_winy
screen 0, wx2, wy2
buffer 3, wx2, wy2
*@
gsel 2:pget mousex,mousey
kr=ginfo_r:kg=ginfo_g:kb=ginfo_b; 拾った色のRGBを閾値とする
gsel 3:gmode 2,wx2,wy2:gcopy 2
gsel 0:color kr,kg,kb:boxf
gsel 3:gmode 6,wx2,wy2,256:gcopy 0 ; 引き算 閾値以下の輝度は0になる
gsel 0:color 254,254,254:boxf
gsel 3:gmode 5,wx2,wy2,256:gcopy 0 ; 足し算 閾値を超える輝度は255になる
gsel 0:gmode 4,wx2,wy2,256
color 0,0,0:boxf:color 254,254,254:gcopy 3 ; All254を黒に変更
gsel 3:color 1,1,1:boxf
gmode 5,wx2,wy2,256:gcopy 0 ; 足し算 輝度はAll255かAll1の2値となる
title "After 閾値 R:"+kr+" G:"+kg+" B:"+kb
gsel 0:gmode 4,wx2,wy2,256
color 0,0,0:boxf:color 1,1,1:gcopy 3 ; All1をAll0に変更
redraw 1:wait 1:redraw 0
goto *@b
|
|
2017/1/19(Thu) 18:21:43|NO.77982
スペース様返信ありがとうございます。
提示されたページを見てみたところほとんど同じ質問があり驚きました。
修正してくださったスクリプトを走らせた結果、求めていたものでした。
しかし、「ほぼ」二値化というのが唯一困っている点です。
1bitビットマップで保存しようと考えているので完全に分けられないとやりづらいです。
どうしてもムリそうならプレビューでこの方法、
保存時にはpget psetで完全に分けるという方法を取ろうと思いますが
もう少し他の方の回答も待って考えてみます。
|
|
2017/1/19(Thu) 18:46:46|NO.77983
#include"a2d.hsp"
C=126;閾値
閾値=""+strf("%x",C)+strf("%x",C)+strf("%x",C);16進のカラーコードに変換
dialog "bmp;*.jpg;*.png", 16 : if stat ! 1 : end
alCreateImageByFile 0, refstr
; グレースケールに変換
cmatrix(MAT_R) = 0.299, 0.587, 0.114, 0.0, 0.0
cmatrix(MAT_G) = 0.299, 0.587, 0.114, 0.0, 0.0
cmatrix(MAT_B) = 0.299, 0.587, 0.114, 0.0, 0.0
cmatrix(MAT_A) = 0.0, 0.0, 0.0, 1.0, 0.0
alCopyModeColorMatrix cmatrix
alCopyImageToImage 0,0,0,0,,,,;画像コピー (Image → Image)
alCopyModeColorKey 0x000000,int("$"+閾値);カラーキー コピーモードを設定。閾値以下を透過する。
color 0,0,0:boxf;HSPウィンドウの背景は黒で、
alCopyImageToScreen 0,0,0,0,,,,;コピーする。
redraw 1:wait 100;経過を表示
alResetCopyMode;コピーモードをリセットして、
alCopyScreenToImage 0,0,0,0,,,,;A2Dのバッファに戻す。
alCopyModeColorKey int("$"+閾値),0xFFFFFF;閾値以上を透過する。
color 255,255,255:boxf;HSPウィンドウの背景は白で、
alCopyImageToScreen 0,0,0,0,,,,;コピーする。
redraw 1;完成!
少し無理やり。
閾値ぴったりの色だけこのソースコードは黒、画像編集ソフトは白になります。
多分以下とか未満の問題だと思いますが、あとは誰かに任せます。
|
|
2017/1/19(Thu) 18:53:45|NO.77984
連投すみません。
結果の微妙な違いはグレースケールにするアルゴリズムの違いでした。
|
|
2017/1/19(Thu) 19:16:19|NO.77985
HSPCVの出番です?
#include "hspcv.as"
cvload "pic.png", 0
cvconvert 0, 0
cvthreshold CV_THRESH_BINARY, 100, 255, 0 ; 明るさ100をしきい値としています
picload "pic.png"
cvgetimg 0
picloadは画像サイズを取得するのが面倒で使ってるだけで、ホントはここで読み込む必要はないですよ。
|
|
2017/1/19(Thu) 19:42:55|NO.77986
やっぱり便利な命令がありましたか・・・薄々予想はしてましたが・・・
|
|
2017/1/19(Thu) 19:56:47|NO.77987
syam様の方法でも思い通りの動作をしました。
まさかそんな便利なものがあると知りませんでした、ありがとうございます。
スペース様の方法も、難しくて理解しづらいですがじっくり見てみたいと思います。
スペース様syam様ありがとうございました。
|
|