Traitement d'image en Red
ldci2-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
DideC8-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 ?
DideC8-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
]
DideC8-Jun-2016/15:08:25+2:00
...et quelques mineures améliorations du code.
ldci10-Jun-2016/18:01:11+2:00
Merci DideC pour la lecture attentive et les améliorations.
A bientôt pour la suite
ldci15-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
DideC15-Jun-2016/17:04:40+2:00
Je ne comprends pas cette dernière remarque/réponse ?!
Quel rapport avec le code de opimage ?
jocko16-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.
jocko16-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"
jocko16-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.
ldci16-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
DideC17-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]
]
jocko17-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é ?
DideC17-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
DideC17-Jun-2016/21:31:23+2:00
...Mais ce sera pas ce WE, car demain : je déménage !
jocko18-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
jocko18-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
ldci18-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
ldci22-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
jocko23-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
ldci23-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 +
DocKimbel26-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
ldci27-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
ldci10-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.


Powered by RebelBB and REBOL 2.7.8.4.2