Traitement d'image en Red | |
ldci | 2-Jun-2016/18:51:27+2:00 |
Bonjour à tous, Je viens de rendre disponible sur GitHub, mes premiers tests pour des fonctions de traitement d'image avec Red (https://github.com/ldci/redCV). Je suis assez impressionné par la vitesse de Red pour ce type de travail Bons tests | |
DideC | 8-Jun-2016/11:18:08+2:00 |
Super François ! Effectivement, c'est rapide, mais après tout, c'est compilé en code machine, donc plutôt logique. Une toute petite coquille : au début de %core.red, un commentaire indique que le format est "RBGA" => c'est "RGBA" (comme détaillé juste ne dessous). Sinon, par curiosité, pourquoi avoir créer le layout face par face sans utiliser le dialecte VID ? | |
DideC | 8-Jun-2016/15:07:48+2:00 |
Pour répondre à ma dernière question, voici ce que ça donne en VID avec le dernier build Red :Red [ Title: "Test images operators Red VID " Author: "Francois Jouen - Didier Cadieu" File: %opimage.red Needs: 'View ] ; fileName: "" isFile: false ; all we need for computer vision with red #include %libs/redcv.red ; for red functions ;interface rimg: make image! reduce [512x512 black] rimg2: make image! reduce [512x512 black] loadImage: does [ isFile: false canvas/image/rgb: black canvas/size: 0x0 tmp: request-file if not none? tmp [ fileName: to string! to-local-file tmp win/text: fileName rimg: load tmp ;generate random image rimg2: rcvRandom rimg 127.127.100.0 ; update faces win/size/x: 20 + max 500 rimg/size/x win/size/y: 50 + max 150 rimg/size/y canvas/size: rimg/size ; canvas/image/size: canvas/size canvas/image: rimg isFile: true op/selected: 1 op2/selected: 1 op3/selected: 1 ] ] img-convert: func [num [integer!]] [ op2/selected: 1 op3/selected: 1 switch num [ 1 [canvas/image: rimg] 2 [canvas/image: rcv2Gray/average rimg ] 3 [canvas/image: rcv2Gray/luminosity rimg ] 4 [canvas/image: rcv2Gray/lightness rimg ] 5 [canvas/image: rcv2BW rimg 127.127.127.0] 6 [canvas/image: rcv2BGRA rimg] 7 [canvas/image: rcv2BGRA rcvReverse rimg] ] ] img-logical: func [num [integer!]] [ op/selected: 1 op3/selected: 1 switch num [ 1 [canvas/image: rimg] 2 [canvas/image: rcvAND rimg rimg2] 3 [canvas/image: rcvNAND rimg rimg2] 4 [canvas/image: rcvOR rimg rimg2] 5 [canvas/image: rcvNOR rimg rimg2] 6 [canvas/image: rcvXOR rimg rimg2] 7 [canvas/image: rcvNXor rimg rimg2] 8 [canvas/image: rcvNot rimg] 9 [canvas/image: rcvAndS rimg 255.0.0.0] 10 [canvas/image: rcvAndS rimg 0.255.0.0] 11 [canvas/image: rcvAndS rimg 0.0.255.0] 12 [canvas/image: rcvORS rimg 0.255.0.0] 13 [canvas/image: rcvXORS rimg 0.255.0.0] 14 [canvas/image: rcvMin rimg2 rimg] 15 [canvas/image: rcvMax rimg2 rimg] 16 [canvas/image: rcvInvert rimg] ] ] img-math: func [num [integer!]] [ op/selected: 1 op2/selected: 1 switch num [ 1 [canvas/image: rimg] 2 [canvas/image: rcvAdd rimg rimg2] 3 [canvas/image: rcvSub rimg2 rimg] 4 [canvas/image: rcvMul rimg rimg2] 5 [canvas/image: rcvDiv rimg rimg2] 6 [canvas/image: rcvMod rimg rimg2] 7 [canvas/image: rcvRem rimg rimg2] 8 [canvas/image: rcvAddS rimg 128] 9 [canvas/image: rcvSubS rimg 64] 10 [canvas/image: rcvMulS rimg 2] 11 [canvas/image: rcvDivS rimg 2] 12 [canvas/image: rcvModS rimg 128] 13 [canvas/image: rcvRemS rimg 64] 14 [canvas/image: rcvPow rimg 2] 15 [canvas/image: rcvLSH rimg 2] 16 [canvas/image: rcvRSH rimg 4] 17 [canvas/image: rcvAddT rimg 128.128.128.0] 18 [canvas/image: rcvSubT rimg 128.128.128.0] 19 [canvas/image: rcvAbsDiff rimg rimg2] ] ] view win: layout [ title "Red view" origin 10x10 space 10x10 style btn: button -1x22 style drop-d: drop-down 120x24 on-create [face/selected: 1] btn "Load" [loadImage] op: drop-d data [ "Conversions" "GrayScale/Average" "GrayScale/Luminosity" "GrayScale/lightness" "Black and White" "RGB to BGR" "Up Down Flip" ] select 1 on-change [if isFile [img-convert face/selected]] op2: drop-d data [ "Logical" "And Images" "Nand images" "Or Images" "Nor Images " "Xor Images" "NXor Images" "Not Image" "And Red" "And Green" "And Blue""Or Green" "Xor Green" "Min Images" "Max Images" "Invert Image" ] select 1 on-change [if isFile [img-logical face/selected]] op3: drop-d data [ "Math" "Add Images" "Substract Images" "Multiply Images" "Divide Images" "Modulo images" "Remainder Images" "Add Scalar (128)" "Substract Scalar (64)" "Multiply by 2" "Divide by 2" "Modulo 128" "Remainder 2" "Power 2" "Left Shift 2" "Right Shift 4" "Add 128.128.128.0" "Sub 128.128.128.0" "Abs Diff Images" ] select 1 on-change [if isFile [img-math face/selected]] btn "Quit" [quit] return canvas: base rimg ] | |
DideC | 8-Jun-2016/15:08:25+2:00 |
...et quelques mineures améliorations du code. | |
ldci | 10-Jun-2016/18:01:11+2:00 |
Merci DideC pour la lecture attentive et les améliorations. A bientôt pour la suite | |
ldci | 15-Jun-2016/13:56:40+2:00 |
Bonjour à tous Une nouvelle version de RedCV https://github.com/ldci/redCV Dans les nouveautés des fonctions statistiques pour l'image et le début des conversions dans les différents espaces de couleurs. Pour répondre à la question de DideC: J'aime assez l'idée de dissocier le code de l'interface pour des raisons personnelles et ce dans l'idée d'un IDE pour Red | |
DideC | 15-Jun-2016/17:04:40+2:00 |
Je ne comprends pas cette dernière remarque/réponse ?! Quel rapport avec le code de opimage ? | |
jocko | 16-Jun-2016/10:00:48+2:00 |
Bonjour, François, bonjour à tous Bravo pour cette implémentation. J'ai deux questions: - comment fais-tu pour te passer des librairies d'origine d'OpenCV ? - dans opimage, certaines fonctions sont des opérations logiques entre deux images. je n'ai pas vu comment charger ces deux images. | |
jocko | 16-Jun-2016/10:04:46+2:00 |
Une autre remarque: je dois dévalider l'antivirus pour faire fonctionner l'exe. AVIRA le bloque avec le motif "HEUR/APC" | |
jocko | 16-Jun-2016/12:56:53+2:00 |
Je viens juste de réaliser que tu n'utilises pas du tout OpenCV, et que tu as codé toi-même les opérateurs. Double bravo, donc. | |
ldci | 16-Jun-2016/17:09:43+2:00 |
Salut Jocko Ca fait plaisir de te voir sur le forum Effectivement RedCV ne se sert pas d'OpenCV Bon on arrivera certainement pas aux 6000 fonctions OpenCV, mais on aura des outils de base. Le projet est ouvert à toute collaboration , donc si le coeur t'en dit | |
DideC | 17-Jun-2016/10:36:55+2:00 |
Salut Les Redeurs, Basé sur ta dernière version de RedCv (enfin celle d'avant hier ), voici le programme opimage codé en VID. En prime, une plus franche séparation entre les fonctions de traitement et le code de l'interface, rendant l'ajout de fonctions bien plus facile. Red [ Title: "Test images operators Red VID " Author: "Francois Jouen - Didier Cadieu" File: %opimage.red Version: 1.2.0 Needs: 'View ] ; all we need for computer vision with red #include %libs/redcv.red ; for red functions isFile: false margins: 10x10 system/view/auto-sync?: no ;interface rimg: make image! reduce [512x512 black] rimg2: make image! reduce [512x512 black] testimg: make image! reduce [512x512 black] loadImage: does [ isFile: false canvas/image: none ;canvas/size: 0x0 tmp: request-file if not none? tmp [ rimg: load tmp ; if image does not fit screen, scale it scale: max 1 1 + max (2 * margins/x + rimg/size/x) / system/view/screens/1/size/x (4 * margins/y + sInfo/size/y + op1/size/y + rimg/size/y) / system/view/screens/1/size/y win/text: append append append to string! to-local-file tmp "(1:" scale ")" ;generate random image rimg2: rcvRandom rimg/size 127.127.100.0 testimg: rcvRandom rimg/size 255.255.255.0 ; redim window with min size win/size/x: 2 * margins/x + max 500 rimg/size/x / scale win/size/y: 4 * margins/y + sInfo/size/y + op1/size/y + max 150 rimg/size/y / scale ; redim image view canvas/size: rimg/size / scale canvas/image: rimg ; update bottom positions and infos sInfo/offset/y: win/size/y - margins/y - sInfo/size/y sBar1/text: form rimg/size sBar2/text: form rcvMeanImage rimg sBar3/text: form scale isFile: true ; reset operation selectors to none do-operation none ;foreach combo [op1 op2 op3] [set in get :combo 'selected 1] ] show win ] ; List of opérations operations: [ conversion [ "Conversions" [rimg] "GrayScale/Average" [rcv2Gray/average rimg ] "GrayScale/Luminosity" [rcv2Gray/luminosity rimg ] "GrayScale/lightness" [rcv2Gray/lightness rimg ] "Black and White" [rcv2BW rimg] "Red Channel" [rcvSplit/red rimg] "Green Channel" [rcvSplit/green rimg] "Blue Channel" [rcvSplit/blue rimg] "RGB => BGR" [rcv2BGRA rimg] "RBG => XYZ" [rcvRGB2XYZ rimg testimg: canvas/image] "XYZ => RGB" [rcvXYZ2RGB testimg] "Up Down Flip" [rcvFlip/vertical rimg] "Left Right Flip" [rcvFlip/horizontal rimg] "V&H Flip" [rcvFlip/vertical rcvFlip/horizontal rimg] ] logical [ "Logical" [rimg] "And Images" [rcvAND rimg rimg2] "Nand images" [rcvNAND rimg rimg2] "Or Images" [rcvOR rimg rimg2] "Nor Images" [rcvNOR rimg rimg2] "Xor Images" [rcvXOR rimg rimg2] "NXor Images" [rcvNXor rimg rimg2] "Not Image" [rcvNot rimg] "And Red" [rcvAndS rimg 255.0.0.0] "And Green" [rcvAndS rimg 0.255.0.0] "And Blue" [rcvAndS rimg 0.0.255.0] "Or Green" [rcvORS rimg 0.255.0.0] "Xor Green" [rcvXORS rimg 0.255.0.0] "Min Images" [rcvMin rimg2 rimg] "Max Images" [rcvMax rimg2 rimg] "Invert Image" [rcvInvert rimg] ] math [ "Math" [rimg] "Add Images" [rcvAdd rimg rimg2] "Substract Images" [rcvSub rimg2 rimg] "Multiply Images" [rcvMul rimg rimg2] "Divide Images" [rcvDiv rimg rimg2] "Modulo images" [rcvMod rimg rimg2] "Remainder Images" [rcvRem rimg rimg2] "Add Scalar (128)" [rcvAddS rimg 128] "Substract Scalar (64)" [rcvSubS rimg 64] "Multiply by 2" [rcvMulS rimg 2] "Divide by 2" [rcvDivS rimg 2] "Modulo 128" [rcvModS rimg 128] "Remainder 2" [rcvRemS rimg 64] "Power 2" [rcvPow rimg 2] "Left Shift 2" [rcvLSH rimg 2] "Right Shift 4" [rcvRSH rimg 4] "Add 128.128.128.0" [rcvAddS rimg 128.128.128.0] "Sub 128.128.128.0" [rcvSubS rimg 128.128.128.0] "Abs Diff Images" [rcvAbsDiff rimg rimg2] ] ] do-operation: func [face [object! none!]] [ ; reset all combo to 1 but the used one foreach combo [op1 op2 op3] [unless same? face combo: get combo [combo/selected: 1]] show win ; no image: exit if any [not isFile none? face] [exit] num: face/selected ope: face/extra ; apply the choosed treatment canvas/image: do select operations/:ope face/data/:num show win ] view win: layout [ title "Red view" origin margins space margins style btn: button -1x22 style drop-d: drop-down 120x24 on-create [ ope: face/extra face/data: extract operations/:ope 2 face/selected: 1 ] on-change [do-operation face face/extra] style fld: field 100x20 style txt: text middle -1x20 btn "Load" [loadImage] op1: drop-d do [op1/extra: 'conversion] op2: drop-d do [op2/extra: 'logical] op3: drop-d do [op3/extra: 'math] btn "Quit" [quit] return canvas: base rimg return sInfo: panel [origin 0x0 txt "Image size:" sBar1: fld txt "Image mean value:" sBar2: fld 80 txt "Scale" sBar3: fld 30x20] ] | |
jocko | 17-Jun-2016/16:56:30+2:00 |
La mise à l'échelle dans cette nouvelle version permet de traiter des images de plus grande taille. En utilisant now/time/precise, on peut alors chronométrer le temps d'exécution de la routine de traitement (do-operation), ce qui permet d'optimiser l'écriture des algos. La plupart des traitements sont rapides, sauf certains. On trouve par exemple que le temps de traitement du flip vertical est anormalement élevé. De même les conversions RGB <> XYZ Par ailleurs, le temps de chargement des images de grande taille est très important (beaucoup plus que le temps de traitement). Est-ce que celà peut-être amélioré ? | |
DideC | 17-Jun-2016/21:30:50+2:00 |
Je pense que ce n'est pas tant le temps de chargement de l'image, que la création des 2 autres images avec rcvRandom + le calcul de rcvMeanImage qui prend du temps. J'ai pas mal d'idées au niveau de l'interface, dont entre autre indiquer le traitement en cours (pour patientez justement). Ajouter le temps de calcul est une bonne idée ! Et j'ai déjà une version pour charger 2 images différentes que je dois fignoler. Pendant ce temps François rajoute des algos. Remarquer comme ils sont facile à ajouter dans cette dernière version VID : une ligne à mettre au bon endroit | |
DideC | 17-Jun-2016/21:31:23+2:00 |
...Mais ce sera pas ce WE, car demain : je déménage ! | |
jocko | 18-Jun-2016/8:41:25+2:00 |
alors bon déménagement ... et du soleil pour t'accompagner Tu as raison sur le temps d'exécution de rcvRandom et de rcvMeanImage. Voici pour info les temps obtenus (en micro-secondes) sur ma machine qui n'est plus très jeune. (NB: sous win10, la précision de now/time/precise laisse à désirer) en version interprétée: --- load image --- images/lena.jpg 0 images/lena-1024.jpg 16000 images/lena-2048.jpg 62000 images/lena-4096.jpg 219000 --- make image! --- 512x512 0 1024x1024 0 2048x2048 47000 4096x4096 140000 --- rcvRandom --- 512x512 284000 1024x1024 1078000 2048x2048 4359000 4096x4096 17490000 --- rcvMeanImage --- 512x512 734000 1024x1024 2938000 2048x2048 11815000 4096x4096 47934000 fin du test | |
jocko | 18-Jun-2016/8:42:53+2:00 |
et en version compilée: --- load image --- images/lena.jpg 0 images/lena-1024.jpg 16000 images/lena-2048.jpg 47000 images/lena-4096.jpg 234000 --- make image! --- 512x512 0 1024x1024 16000 2048x2048 31000 4096x4096 157000 --- rcvRandom --- 512x512 219000 1024x1024 922000 2048x2048 3641000 4096x4096 14270000 --- rcvMeanImage --- 512x512 500000 1024x1024 2125000 2048x2048 7955000 4096x4096 32162000 ... c'est à dire assez peu de différence | |
ldci | 18-Jun-2016/22:09:17+2:00 |
Bravo à DideC pour le code amélioré et bon déménagement ! Vous avez raison pour les fonctions rcvRandom et rcvMean: elles sont trop lentes en Red et je vais les réécrire comme une routine Red/System. En tout cas merci à tous pour les tests et les optimisations. Pour les anciens reboleurs, les fonctions rcvConvolve sont très proches de celles écrites par Cyphre pour Rebol 2 Bon WE | |
ldci | 22-Jun-2016/17:35:21+2:00 |
Salut @ tous J'ai mis à jour sur https://github.com/ldci/redCV Au menu, une amélioration sensible de la vitesse pour les fonctions statistiques réécrites en Red/S ainsi que le calcul du temps nécessaire pour les routines et l'affichage: 4 ms pour charger (avec rcvMeanImage et CvRandom) de 2024x768 A tester | |
jocko | 23-Jun-2016/13:32:31+2:00 |
Salut, voici, sur ma machine, les temps d'exécution de cette nouvelle version, pour des images 512x512. Les temps sont en micro-secondes (us), et sont à peu près proportionnels à la taille des images. load image : 4600 us make image! : 3200 us rcvRandom : 3100 us rcvMeanImage : 4700 us Conversions ------------------------ GrayScale/Average : 6200 us GrayScale/Luminosity : 7800 us GrayScale/lightness : 6300 us Black and White : 9400 us Red Channel : 4700 us Green Channel : 6200 us Blue Channel : 4700 us RGB => BGR : 4700 us RBG => XYZ : 142200 us XYZ => RGB : 143800 us Up Down Flip : 23400 us Left Right Flip : 3100 us V&H Flip : 26600 us Logical ----------------- And Images : 3100 us Nand images : 1600 us Or Images : 3100 us Nor Images : 3100 us Xor Images : 3200 us NXor Images : 3100 us Not Image : 3100 us And Red : 4700 us And Green : 4700 us And Blue : 6200 us Or Green : 4700 us Xor Green : 6300 us Min Images : 3100 us Max Images : 3100 us Invert Image : 9400 us Math -------------- Add Images : 3100 us Substract Images : 1600 us Multiply Images : 3100 us Divide Images : 4700 us Modulo images : 3100 us Remainder Images : 3100 us Add Scalar (128) : 3200 us Substract Scalar (64) : 1500 us Multiply by 2 : 3200 us Divide by 2 : 3100 us Modulo 128 : 3100 us Remainder 2 : 3100 us Power 2 : 3200 us Left Shift 2 : 3100 us Right Shift 4 : 3100 us Add 128.128.128.0 : 1600 us Sub 128.128.128.0 : 3100 us Abs Diff Images : 4700 us | |
ldci | 23-Jun-2016/19:17:17+2:00 |
@jocko: les temps sont proportionnels car on est obligé de parcourir l'image en x et y. Certaines fonctions peuvent directement la chaine binaire rgb (la vitesse sera à tester) Pour le fun regarde cette fonction split: function[source [image!] channel [integer!] return: [image!]][ rgb1: extract/index source/rgb 3 1 rgb2: extract/index source/rgb 3 2 rgb3: extract/index source/rgb 3 3 rgb: rgb1 append rgb rgb2 append rgb rgb3 w: round(source/size/x / 1) h: round(source/size/y / 1) img: make image! reduce [as-pair w h rgb] img ] A + | |
DocKimbel | 26-Jun-2016/11:13:47+2:00 |
Je tenais juste à exprimer mon double plaisir de voir une lib native de CV pour Red prendre vie et de voir les rebolers français collaborer sur ce projet, qui a un grand avenir! RedCV est d'autant plus intéressant qu'il fournit un cas d'utilisation réelle de Red avec un éventail de ces points forts, comme VID/View ou encore l'intégration Red et Red/System. Ce projet va permettre d'améliorer Red significativement, j'en suis certain. @François: tu peux ouvrir un chat sur http://gitter.im pour ton repo ldci/RedCV sur Github si tu le souhaites. Je te recommande également de jeter un oeil sur le code de cette nouvelle démo, je pense que tu peux en tirer quelques idées pour optimiser davantage RedCV: https://github.com/red/code/blob/v0.6.1/Scripts/mandelbrot-fast.red | |
ldci | 27-Jun-2016/9:40:09+2:00 |
Merci Nénad pour le lien : je vais regarder ça en détail. RedCV doit être un projet collaboratif : on est plus intelligents à plusieurs! Amicalement | |
ldci | 10-Jul-2016/13:18:10+2:00 |
Nouvelle version profondément modifiée et réorganisée sur github. Amélioration notable de la vitesse de rendu Plein de nouveaux exemples pour DideC s'amuse à faire de belles interfaces. Les convolutions seront mises à jour dès que possible La documentation est en cours de rédaction Bon WE | |
Login required to Post. |