HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0119
赤松処理の高速化をしたい7解決


赤松

リンク

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

連投すみません。
結果の微妙な違いはグレースケールにするアルゴリズムの違いでした。



syam

リンク

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様ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.