Extraire des valeurs d'un tableau

Résolu
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018 - 8 juin 2015 à 19:12
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018 - 11 juin 2015 à 21:22
Bonjour et merci de votre aide et du temps consacré
Mon projet et de réaliser une toute petite application pour automatiser la réalisation de patron de livre plié comme montré dans l'exemple sur ce site :
http://www.faitmain-faitcoeur.fr/en-papier/tuto-livre-plie-ecriture/

Donc jusqu'à maintenant :
1) Je charge une photo dans une pictureBox (Image brut sans le traçage de ligne) : çà j'y suis arrivé
2) Je récupère les hauteurs de bande de couleur (départ=>arrivée) de chaque colonne dans un tableau comme le tableau ci-dessous : çà j'y suis arrivé
3) Et donc maintenant il me faudrait extraire le tableau final et là franchement pour moi c'est trop compliqué donc si quelqu'un pouvait me donner des conseil ce serait très gentil.



Voici le problème que je rencontre dans un tableau à deux dimension comme ci-dessous je voudrais extraire des données dans un nouveau tableau.
Donc voici comment mon tableau est formalisé
4 188 193
5 188 193
6 187 193
7 101 116
7 186 193
8 93 124
8 185 193
9 90 127
9 184 193
10 85 131
10 184 192
11 83 133
11 183 192
12 80 137
12 181 192
13 79 139
13 180 192
14 75 141
14 179 192
15 74 143
15 178 192
16 72 145
16 176 192
17 71 146
17 176 191
18 69 148
18 174 191
19 67 149
19 173 191
20 65 151
20 171 191
21 65 152
21 170 191
22 63 154
22 167 191
23 62 155
23 166 191
24 60 157
24 163 191
25 59 157
25 162 191
26 58 191
27 57 191
28 56 191
29 55 191
30 54 98
30 120 191
31 53 94
31 123 192
32 52 88
32 128 192
33 51 86
33 131 192
34 50 82
34 135 192
35 49 80
35 135 192
36 49 78
36 131 193
37 48 76
37 129 193
38 47 73
38 126 193
39 46 72
39 124 193
40 45 70
40 120 191
41 45 69
41 118 189
42 44 67
42 114 185
43 43 66
43 112 183
44 4 8
44 43 64
44 108 179
45 3 8
45 42 63
45 106 177
46 3 9
46 41 61
46 102 175
47 4 10
47 41 60
47 100 176
48 5 11
48 40 59
48 97 177
49 5 12
49 40 58
49 95 177
50 5 14
50 39 57
50 91 178
51 6 14
51 39 56
51 89 161
51 161 178
52 7 16
52 38 55
52 84 157
52 162 179
53 7 18
53 37 54
53 82 155
53 162 179
54 7 20
54 37 53
54 77 151
54 164 180
55 8 22
55 37 52
55 75 149
55 164 180
56 9 25
56 36 51
56 69 145
56 166 181
57 9 27
58 61 139
58 167 182
59 10 34
59 35 49
59 57 137
59 167 182
60 11 134
60 169 183
61 11 132
61 169 183
62 12 128
62 170 183
63 13 126
63 170 184
64 13 122
64 172 184
ect ...
donc Voici les conditions d'extraction :
En colonne 0 : un numéro unique ou répété
Donc en partant du départ du tableau colonne "0":
Si le numéro est unique alors
je récupère la ligne
autrement
Si le numéro est répété alors
je récupères qu'une seule ligne des numéro répété avec comme condition:
à la première ligne de la colonne "0" si le numéro est répété alors
je prends la valeur la plus haute de la colonne "1" et je conserve donc cette ligne.
Ensuite je continu et dans la série d'après quelque soit le nombre de répetition je prend la valeur inférieur à celle d'avant .
Lorsque j'arrive à la valeur la plus petite ; je redémarre avec une valeur la plus haute
jusqu'à arrivé à un numéro unique
comme ceci jusqu'à la fin du tableau.
Merci Bcp

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juin 2015 à 19:20
Bonjour,
et donc, dans ta série des "donc", jugeant la chose trop "compliquée" pour toi, tu attends quoi, exactement ?
Je te rappelle que l'on ne reçoit ici de l'aide que concernant une difficulté technique, spécifique et parfaitement isolée rencontrée dans le cours de ton développement.
Où est cette difficulté précise et isolée (accompagnée du code au moins tenté pour la résoudre) ?
1
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
8 juin 2015 à 20:32
Bonsoir et c'est là que l'on se dit
Oh, quel dommage de ne pas se servir de .Net (VB, C#, etc.. peu importe) pour ce que c'est => Un Langage Objet
Et oui , j'ai déjà dit que ton programme serait bien plus simple à coder avec une collection d'objets, mais bon....

1
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
8 juin 2015 à 20:54
Bonsoir
Je vais essayer ............mais là pour moi çà risque d'être l'everest

En tout cas merci de votre aide et du temps consacré
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
8 juin 2015 à 21:26
L'idée de base avec l'objet "métier" c'est de concentrer dans une classe les données et action afférents à un "thème".

J'ai décidé que l'objet pour être inialisé de 2 façons, qu'il contient les données col0, col1, col2 et compte, qu'il sait compter les occurrences de col0 et qu'il sait trier et apurer la liste
Imports System.Collections.Generic
Imports System.Linq


Public Class ExempleRoro
    Public Sub New(ByVal Col0 As Integer, ByVal Col1 As Integer, ByVal Col2 As Integer)
        Me.New(Col0, Col1, Col2, 0)
    End Sub

    Public Sub New(ByVal Col0 As Integer, ByVal Col1 As Integer, ByVal Col2 As Integer, ByVal Count As Integer)
        Colonne0 = Col0
        Colonne1 = Col1
        Colonne2 = Col2
        Compte = Count
    End Sub


    Public Property Colonne0() As Integer

    Public Property Colonne1() As Integer

    Public Property Colonne2() As Integer

    Private privateCompte As Integer
    Public Property Compte() As Integer
        Get
            Return privateCompte
        End Get
        Private Set(ByVal value As Integer)
            privateCompte = value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return String.Format("{0} {1} {2} {3}", Colonne0, Colonne1, Colonne2, Compte)
    End Function

    Public Shared Function Compter(ByVal Liste As List(Of ExempleRoro)) As List(Of ExempleRoro)
        Return (
            From item In Liste
            Let c = Liste.Select(Function(tt) tt.Colonne0).Count(Function(ttt) ttt = item.Colonne0)
            Select New ExempleRoro(item.Colonne0, item.Colonne1, item.Colonne2, c)).ToList()

    End Function

    Public Shared Function SansDoublonsCol0(ByVal Liste As List(Of ExempleRoro)) As List(Of ExempleRoro)
        Return (
            From item In Liste.OrderBy(Function(x) x.Colonne0).ThenByDescending(Function(xx) xx.Colonne1).GroupBy(Function(xxx) xxx.Colonne0)
            Select New ExempleRoro(item.Key, item.ElementAt(0).Colonne1, item.ElementAt(0).Colonne2, item.ElementAt(0).Compte)).ToList()

    End Function


End Class



Et comment on s'en sert
        Dim maListe As New List(Of ExempleRoro)()
        maListe.Add(New ExempleRoro(4, 188, 193)) 'compte 1 affiche la ligne attendue à la fin
        maListe.Add(New ExempleRoro(7, 101, 116))
        maListe.Add(New ExempleRoro(5, 188, 193)) 'compte 1
        maListe.Add(New ExempleRoro(7, 186, 193)) 'compte 2
        maListe.Add(New ExempleRoro(8, 93, 124))
        maListe.Add(New ExempleRoro(9, 90, 127))
        maListe.Add(New ExempleRoro(8, 185, 193)) 'compte 2
        maListe.Add(New ExempleRoro(9, 184, 193)) 'comte 3
        maListe.Add(New ExempleRoro(11, 83, 133))
        maListe.Add(New ExempleRoro(9, 85, 13))
        maListe.Add(New ExempleRoro(10, 184, 19)) 'compte 1
        maListe.Add(New ExempleRoro(11, 183, 19)) 'compte 2

        Dim maListeAvecCompte As List(Of ExempleRoro) = ExempleRoro.Compter(maListe)
        Dim maListeApureeEtTrieeParColonne0 As List(Of ExempleRoro) = ExempleRoro.SansDoublonsCol0(maListeAvecCompte)


C'est vite fait, ça doit pouvoir être amélioré, et peu commenté (je pense que ça parle de soi même)
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018 > Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024
9 juin 2015 à 19:05
Bonsoir et merci beaucoup de votre aide
Voilà j'ai insérer votre code dans mon projet ;je récupère bien les données unique dans mon fichiers texte ; mais comment puis les récupèrer comme dans ma demande.
En tout cas c'est très sympa de faire partager vos connaissance merci beaucoup

Dim pc As New System.IO.StreamWriter("C:/count/pixelcompter.txt", False)
pc.WriteLine("Begin Count:")
pc.WriteLine()
pc.Close()
Dim img As Bitmap = New Bitmap(PictureBox1.Image)
Dim c As Color
Dim maListe As New List(Of ExempleRoro)()
For i = 0 To img.Width - 1
Dim toppix As Integer = 0
Dim pixlength As Integer = 0
Dim j As Integer
For j = 0 To img.Height - 1
c = img.GetPixel(i, j)
Dim r As Integer = 0
r = Convert.ToInt16(c.R)
Dim g As Integer = 0
g = Convert.ToInt16(c.G)
Dim b As Integer = 0
b = Convert.ToInt16(c.B)
Dim ans As Integer = ((r + (g + b)) / 3)


If (ans > 128) Then
r = 255
g = 255
b = 255
Else
r = 0
g = 0
b = 0
End If
Dim total As Integer = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else

maListe.Add(New ExempleRoro(i, toppix - 1, toppix + pixlength))
toppix = 0
pixlength = 0
End If
End If
Next

Next
Dim maListeAvecCompte As List(Of ExempleRoro) = ExempleRoro.Compter(maListe)
Dim maListeApureeEtTrieeParColonne0 As List(Of ExempleRoro) = ExempleRoro.SansDoublonsCol0(maListeAvecCompte)
For Each element In maListeApureeEtTrieeParColonne0
Dim pce As New System.IO.StreamWriter("C:/count/pixelcompter.txt", True)
pce.WriteLine(element)
pce.Close()
Next

Merci pour tout
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
Modifié par Whismeril le 9/06/2015 à 21:33
Tout d'abord, comme je te l'ai écrit plus haut, l'idée est de concentrer tout un thème dans une classe, la partie ou tu lis l'image et fait tes calculs, pourrait être insérée dans la classe, mais ça marche très bien comme ça aussi.
La classe que je t'ai donnée, c'est surtout pour que tu appréhendes l'idée de l'objet, je ne saurais que trop de conseiller de lire avec attention ce cours
http://plasserre.developpez.com/cours/vb-net/?page=introduction#LI

Linq demande un peu d'entrainement, (pour ceux qui ont fait du sql, c'est proche), il faut attention à l'exécution différée
http://blogs.developpeur.org/tom/archive/2007/06/27/linq-l-ex-cution-diff-r-e-des-requ-tes-linq.aspx

Pour ne pas avoir d'effets "de bords" avec ton code, j'ai forcé l'exécution immédiate en castant le résultat en ListOf, avec le ToList()

Par contre ta demande pour prendre un coup le plus grand, un coup le plus petit, ça va complexifier un peut le code.
Pas sûr de le faire en une seule requête, ce qui en soit n'est pas bien grave, un peu de temps d'exécution en plus peut-être.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024
Modifié par Whismeril le 9/06/2015 à 22:00
Je n'ai pas trouvé de requête
alors je l'ai fait à l'ancienne
    Public Shared Function SansDoublonsCol0(ByVal Liste As List(Of ExempleRoro)) As List(Of ExempleRoro)

        Dim groupeTrieeParCol0PuisCol1 = Liste.OrderBy(Function(x) x.Colonne0).ThenByDescending(Function(xx) xx.Colonne1).GroupBy(Function(xxx) xxx.Colonne0).ToList()
        'la collection est triée par colO dans l'ordre et col1 en ordre inverse, ainsi le premier enregistrement contient le col1 le plus grand
        'le groupBy génère une collection du type
        'Clé1
        'enregistrement 1 de la clé1
        'enregistrement 2 de la clé1
        '...
        'Clé2
        'enregistrement 1 de la clé2
        'enregistrement 2 de la clé2
        '...

        Dim PlusGrand As Boolean = True
        Dim retour As New List(Of ExempleRoro)()

        For Each item In groupeTrieeParCol0PuisCol1
            If item.Count() = 1 Then
                retour.Add(New ExempleRoro(item.Key, item.First().Colonne1, item.First().Colonne2, item.First().Compte))
            Else
                If PlusGrand Then
                    retour.Add(New ExempleRoro(item.Key, item.First().Colonne1, item.First().Colonne2, item.First().Compte))
                Else
                    retour.Add(New ExempleRoro(item.Key, item.Last().Colonne1, item.Last().Colonne2, item.Last().Compte))
                End If

                PlusGrand = Not PlusGrand
            End If
        Next item

        Return retour
    End Function
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
8 juin 2015 à 20:52
Bonsoir et merci de votre intèret
voici ce qui a été tenté pour récupérer les infos:
'reprise dans la colonne 4 des répétitions

 For i = LBound(Tablo, 2) To UBound(Tablo, 2)
    MonDico(Tablo(0, i)) = MonDico(Tablo(0, i)) + 1
 Next
 For i = LBound(Tablo, 2) To UBound(Tablo, 2)
    Tablo(3, i) = MonDico(Tablo(0, i))
 Next

 'Création Tableau final
 Rep = 0
 Ind = 0
 x = 0
 While Ind < UBound(Tablo, 2)
    If Tablo(3, Ind) = Rep Then
        For i = 0 To 2
            ReDim Preserve tabfin(0 To 2, 0 To x)
            tabfin(i, x) = Tablo(i, Ind + Rep1 - 1) ' et non Ind+Rep1
        Next i
        If Rep1 = 1 Then Rep1 = Rep Else Rep1 = Rep1 - 1
        Ind = Ind + Rep
        x = x + 1
    Else
        Rep = Tablo(3, Ind)
        Rep1 = Rep
    End If
 Wend


Mais en fait je me suis aperçu que ce n'ètait pas sur les répetions qu'il fallait filtrer mais sur l'ensemble de la colonne. Et là j'ai beau chercher je ne trouve vraiment pas.
Après ceci ;si je n'ai pas d'autre piste je mettrai fin à ce projet car un peu trop compliqué pour moi.
En tout cas merci de votre aide et du temps consacré
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
9 juin 2015 à 12:44
Salut cs_roro69
le plus dur est de comprendre ce que tu veux faire
Voilà ce que j'ai compris

4 188 193 ' n4 : unique on prend 188
5 188 193 ' n5 : unique on prend 188
6 187 193 ' n6 : unique on prend 187
7 101 116 ' n7 : on prend 186 en colonne 1
7 186 193
8 93 124 ' n8 : on prend 185 car < 186 en colonne 1
8 185 193
9 90 127 ' n9 : on prend 184 car < 185 en colonne 1
9 184 193
10 85 131 ' n10 : on prend 85 car < 184 en colonne 1
10 184 192
11 83 133 ' n11 : on prend 83 car < 85 en colonne 1
11 183 192
12 80 137 ' n12 : on prend 80 car < 83 en colonne 1
12 181 192
13 79 139 ' n13 : on prend 79 car < 80 en colonne 1
13 180 192
14 75 141 ' n14 : on prend 75 car < 79 en colonne 1
14 179 192
15 102 143 ' n15 : on prend 178 car pas de valeur < à 75
-15 178 192
16 72 145 ' n16 : on prend 176 car < 178 en colonne 1
16 176 192
17 71 146 ' n17 : on prend 71 car < 176 en colonne 1
17 176 191

J'ai modifié la ligne avec un tiret pour ce qui suit.
Si à un moment on ne trouve pas dans la série courante une valeur inférieure à celle prise dans la série précédente ( la série avec le n° 15) on prend la valeur la plus haute de la série courante et on continue à la prochaine série et répétant le processus
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
9 juin 2015 à 19:00
Bonsoir merci de votre aide et du temps conscré
Non ce n'est pas comme çà que je souhaites extraire mes données ;il est vrai que j'ai très mal expliquer ma demande; en fait je souhaite alterné plus grand au plus petit
4 188 193 ( unique donc je prend ligne)
5 188 193 ( unique donc je prend ligne)
6 187 193 ( unique donc je prend ligne)
7 101 116
7 186 193 (Là je prend plus grand (colonne1))
8 93 124 (Là je prend plus petit (Colonne1))
8 185 193
9 90 127
9 184 193 (Là je prend plus grand (colonne1))
10 85 131 (Là je prend plus petit (Colonne1))
10 184 192
11 83 133
11 183 192 (Là je prend plus grand (colonne1))
12 80 137 (Là je prend plus petit (Colonne1))
12 181 192
13 79 139
13 180 192 (Là je prend plus grand (colonne1))
14 75 141 (Là je prend plus petit (Colonne1))
14 179 192
15 74 143 ( unique donc je prend ligne)
16 72 145
16 176 192 (Là je prend plus grand (colonne1))
17 71 146 (Là je prend plus petit (Colonne1))
44 4 8
44 43 64
44 108 179 (Là je prend plus grand (colonne1))
45 3 8
45 42 63 (Là je prend intermédiare (colonne1))
45 106 177
46 3 9 (Là je prend plus petit (Colonne1))
46 41 61
46 102 175
47 4 10
47 41 60 (Là je prend intermédiare (colonne1))
47 100 176
48 5 11
48 40 59
48 97 177 (Là je prend intermédiaire (colonne1))
48 100 176
49 40 58
49 95 177 (Là je prend plus grand (colonne1))
50 5 14 (Là je prend plus petit (Colonne1))
50 39 57
50 91 178
51 6 14
51 39 56 (Là je prend intermédiare (colonne1))
51 89 161
51 89 161
51 161 178
52 7 16
52 38 55
52 84 157 (Là je prend intermédiare (colonne1))
52 162 179
53 7 18
53 37 54
53 82 155
53 162 179 (Là je prend plus grand (colonne1))
54 7 20 (Là je prend plus petit (Colonne1))
54 37 53
54 77 151
54 164 180
55 8 22
55 37 52 (Là je prend intermédiare (colonne1))
55 75 149
55 164 180
56 9 25
56 36 51
56 69 145 (Là je prend intermédiare (colonne1))
56 166 181
57 9 27 Unique
58 61 139
58 167 182 (Là je prend plus grand (colonne1))

Un peu compliqué je suis désolé ;;;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
9 juin 2015 à 15:42
Bonjour

Je récupère les hauteurs de bande de couleur (départ=>arrivée) de chaque colonne dans un tableau comme le tableau ci-dessous : çà j'y suis arrivé

Peux tu montrer ton code ?
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
9 juin 2015 à 18:25
Bonsoir et merci de votre aide et du temps consacré

--Donc voici le code pour récupérer les valeurs départ arrivée:

Dim pc As New System.IO.StreamWriter("C:/Compter/pixelcompter.txt", False)
pc.WriteLine("Begin Count:")
pc.WriteLine()
pc.Close()
Dim img As Bitmap = New Bitmap(PictureBox1.Image)
Dim c As Color

For i = 0 To img.Width - 1
Dim toppix As Integer = 0
Dim pixlength As Integer = 0
Dim j As Integer
For j = 0 To img.Height - 1
c = img.GetPixel(i, j)
Dim r As Integer = 0
r = Convert.ToInt16(c.R)
Dim g As Integer = 0
g = Convert.ToInt16(c.G)
Dim b As Integer = 0
b = Convert.ToInt16(c.B)
Dim ans As Integer = ((r + (g + b)) / 3)


If (ans > 128) Then
r = 255
g = 255
b = 255
Else
r = 0
g = 0
b = 0
End If
Dim total As Integer = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else
Dim pcr As New System.IO.StreamWriter("C:/Compter/pixelcompter.txt", True)
pcr.WriteLine(" " & i & " " & toppix - 1 & " " & toppix + pixlength)
pcr.WriteLine()
pcr.Close()

toppix = 0
pixlength = 0
End If
End If
Next

Next
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57 > cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
9 juin 2015 à 21:46
Pourquoi écris tu dans un fichier txt et après tu dois encore lire le fichier et traiter les données

au lieu de
Dim pcr As New System.IO.StreamWriter("C:/Compter/pixelcompter.txt", True)
pcr.WriteLine(" " & i & " " & toppix - 1 & " " & toppix + pixlength)
pcr.WriteLine()
pcr.Close()


traite les données selon tes besoins au fur et mesure
dans la boucle tu as

i , toppix - 1 , toppix + pixlength

d'abord je n'ai pas compris

4 188 193 ( unique donc je prend ligne)

7 101 116
7 186 193 (Là je prend plus grand (colonne1))
8 93 124 (Là je prend plus petit (Colonne1))
8 185 193
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 juin 2015 à 13:53
salut cs_roro69

Regarde ce que donne ce code
sur une Form tu mets
- ta PictureBox1
- 3 Listbox (1 , 2 et 3 ) côte-côte et de même dimension
- un bouton Button1 pour lancer le processus

Les listboxs vont afficher les valeurs des 3 colonnes
On a compris pour prendre le plus haut et le plus bas
Problème : pourquoi prend-on à certains endroits les valeurs intermédiaires ?
Essaies d'expliquer avec l'exemple que tu as donné ( voir ci-dessous) en te servant des valeurs des colonnes pour qu'on comprenne ! Merci

15 74 143 ( unique donc je prend ligne)
16 72 145
16 176 192 (Là je prend plus grand que 74(colonne1))
17 71 146 (Là je prend plus petit (Colonne1)) voir remarque
44 4 8
44 43 64
44 108 179 (Là je prend plus grand (colonne1))
45 3 8
45 42 63 (Là je prend intermédiare) pourquoi pas 106 ?
45 106 177
46 3 9 (Là je prend plus petit (Colonne1))
46 41 61
46 102 175
47 4 10
47 41 60 (Là je prend intermédiare) pourquoi pas 100 ?
47 100 176
48 5 11
48 40 59
48 97 177 (Là je prend intermédiaire (colonne1))
48 100 176
49 40 58
49 95 177 (Là je prend plus grand (colonne1))
50 5 14 (Là je prend plus petit (Colonne1))
50 39 57
50 91 178


de plus cette ligne est unique
17 71 146 (Là je prend plus petit (Colonne1))
donc là je prends la ligne ! Ok mais ensuite c'est plus petit ou plus grand qu'il faut prendre ?

Public Class Form1

Private Structure Structcolonne
Dim col0 As Integer
Dim col1 As Integer
Dim col2 As Integer
End Structure

Private listecols As New List(Of Structcolonne)
Private listecol As Structcolonne

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim img As Bitmap = New Bitmap(PictureBox1.Image)
Dim c As Color, r As Integer, g As Integer, b As Integer
Dim toppix As Integer, pixlength As Integer, total As Integer, ans As Integer

For i = 0 To img.Width - 1
toppix = 0
pixlength = 0
For j = 0 To img.Height - 1
c = img.GetPixel(i, j)
r = Convert.ToInt32(c.R)
g = Convert.ToInt32(c.G)
b = Convert.ToInt32(c.B)
ans = (r + g + b) \ 3
If (ans > 127) Then
r = 255 : g = 255 : b = 255
Else
r = 0 : g = 0 : b = 0
End If
total = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else
With listecol
.col0 = i
.col1 = toppix - 1
.col2 = toppix + pixlength
End With
listecols.Add(listecol)
toppix = 0
pixlength = 0
End If
End If
Next
Next
For i = 0 To listecols.Count - 1
With listecols(i)
ListBox1.Items.Add(.col0.ToString)
ListBox2.Items.Add(.col1.ToString)
ListBox3.Items.Add(.col2.ToString)
End With
Next

End Sub

End Class

0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 juin 2015 à 14:15
Autre chose

Lorsque pour la colonne 1 il y a plusieurs fois le même nombre on prend le plus petit ou le plus grand de cette série ! C'est bien cela ?

4 188 193 ( unique donc je prend ligne)
5 188 193 ( unique donc je prend ligne)
6 187 193 ( unique donc je prend ligne)
7 101 116
7 186 193 (Là le plus grand parmi la série des 7
8 93 124 (Là le plus petit parmi la série des 8)
8 185 193
9 90 127
9 184 193 (Là le plus grand parmi la série des 9)
intermédiaire ????????
10 85 131 (Là le plus petit parmi la série de 10)
10 184 192
etc........

si un intermédiaire était placé entre 9 et 10 cela ne change pas la suite une fois sur 2 plus petit plus grand ?
Pourquoi des intermédiaires et sur quoi te bases-tu pour les déterminer ?

Le truc est très facile à faire mais il faut comprendre le mécanisme exact
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
10 juin 2015 à 18:26
Bonsoir et merci pour votre aide et vos conseils
Je vais tenté de reformuler depuis le début donc :
Mon projet et de réaliser une toute petite application pour automatiser la réalisation de patron de livre plié comme montré dans l'exemple sur ce site :
http://www.faitmain-faitcoeur.fr/en-papier/tuto-livre-plie-ecriture/

Donc pour ce faire :
1) Je charge une photo dans une pictureBox (Image brut)
2) Je récupère les départ et arrivée (d'une couleur) de chaque colonne de toute l'image
3)Donc ensuite comme expliqué dans le `''tuto ci-dessus'''' chaque colonne représente une feuille qu'il faut plié.(Donc chaque colonne doit être unique)
4) Donc si colonne unique on garde ainsi
5) Si colonne répété 2 fois alors :

- une colonne réalise la partie haute, (Valeur de départ la plus élevé)
- la colonne suivante réalise la partie basse, (Valeur de départ la plus petite)
- la colonne suivante réalise la partie haute (Valeur de départ la plus élevé)
- la colonne suivante réalise la partie basse(Valeur de départ la plus petite) ....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux fois

6)Si colonne répeté 3 fois alors
- une colonne réalise la partie haute, (Valeur de départ la plus élevé)
- la colonne suivante réalise la partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- la colonne suivante réalise la partie basse (Valeur de départ la plus petite)
- la colonne suivante réalise la partie haute(Valeur de départ la plus haute)
- la colonne suivante réalise la partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- la colonne suivante réalise la partie basse (Valeur de départ la plus petite)
....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux ,trois ; quatre ,cinq fois .

7)Si colonne répété 4 fois ou + alors :
--Même principe que les colonnes répété 3 fois en ajoutant deux partie milieu,(Valeur de départ entre la plus élevé et la plus petite )

Je suis désolé de ne pas pouvoir mieux expliquer ma demande
Merci de votre temps consacré et de votre aide
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par Whismeril le 10/06/2015 à 20:57
2) Je récupère les départ et arrivée (d'une couleur) de chaque colonne de toute l'image

Je ne comprends pas.
De quelle couleur ?
Montre ce code de "récupération". Il nous permettra peut-être (?) de comprendre ce que tu veux dire ..
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 10/06/2015 à 21:06
1 efface ces lignes
pc.WriteLine("Begin Count:")
pc.WriteLine()
pc.Close()
et dans la boucle
pc.WriteLine()



Private listnum As New List(Of List(Of Int32))
'la liste des résultats
Private listresult As New List(Of List(Of Int32))
Private list1 As New List(Of String)

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
'on lit ton fichier pixelcompter.txt et on le décompose
GetList()
DataProcess()
End Sub
Private Sub GetList()
list1 = IO.File.ReadAllLines("C:/Compter/pixelcompter.txt").ToList
Dim numbers As List(Of Int32)
Dim vect() As String
For Each item In list1
vect = item.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
numbers = New List(Of Int32)
For Each num In vect
numbers.Add(Convert.ToInt32(num))
Next
listnum.Add(numbers)
Next
End Sub
Private Sub DataProcess()
' selon ton algo
' En colonne 0 : un numéro unique ou répété
'Donc en partant du départ du tableau colonne "0":
'Si le numéro est unique alors je récupère la ligne
'autrement Si le numéro est répété alors
'je récupères qu'une seule ligne des numéro répété avec comme 'condition:
'à la première ligne de la colonne "0" si le numéro est répété 'alors
'je prends la valeur la plus haute de la colonne "1" et je conserve 'donc cette ligne.
'Ensuite je continu et dans la série d'après quelque soit le 'nombre de répetition je prend la valeur inférieur à celle d'avant .
'Lorsque j'arrive à la valeur la plus petite ; je redémarre avec une 'valeur la plus haute
'jusqu'à arrivé à un numéro unique
Dim flaghighest As Boolean = True
Dim data As New List(Of Int32)
Dim lastindex As Int32
lastindex = listnum(0)(0)
listresult.Add(listnum(0))
For iter = 1 To listnum.Count - 1
If listnum(iter)(0) <> lastindex Then
'index unique
listresult.Add(listnum(iter))
lastindex = listnum(iter)(0)
ElseIf flaghighest Then
'get highest value
If listnum(iter)(1) > listnum(iter - 1)(1) Then
listresult.RemoveAt(listresult.Count - 1)
listresult.Add(listnum(iter))
End If
lastindex = listnum(iter)(0)
flaghighest = False
Else
'get lowest value
If listnum(iter)(1) < listnum(iter - 1)(1) Then
listresult.RemoveAt(listresult.Count - 1)
listresult.Add(listnum(iter))
End If
lastindex = listnum(iter)(0)
flaghighest = True
End If
Next

End Sub


End Class
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
10 juin 2015 à 22:11
Bonsoir et merci beaucoup
J'ai testé votre code ; rien ne se passe dans le fichier texte
Merci de votre aide et du temps consacré
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57 > cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
Modifié par cs_ShayW le 10/06/2015 à 22:24
J'ai testé votre code ; rien ne se passe dans le fichier texte
le résultat n'est pas dans le fichier texte
je ne sais ce que tu as testé
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
10 juin 2015 à 22:52
Bonsoir
Oups vraiment désolé ;de ma réponse ;
veuillez m'excuser .
Je testerai le code demain là c'est direction boulot
Bonne soirée et vraiment merci de votre aide et du temps consacré
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 juin 2015 à 21:46
J'ai été sur le site par curiosité et je commence à comprendre
Dans ton tableau d'origine tu as les colonnes d'une image
Chaque colonne peut contenir 1 bloc ou 2 blocs ou plus avec à chaque fois le point de départ de la couleur et son point d'arrivée

- si il n'y a qu'un bloc on prend la ligne ( cela correspond à une colonne pleine sur l'image)
- si il y a 2 blocs on prend alternativement le haut pour le bloc courant et le bas du bloc suivant : c'est à dire que les 2 colonnes de l'image sont représentées qu'à moitié ( la première est le haut et la seconde est le bas)
-si il y a 3 blocs on prend le haut pour le bloc courant , l'intermédiaire du bloc suivant et le bas du bloc qui suit le précédent

Et encore je dis cela mais sans aucune certitude
C'est bien des Japonais avec leur origami pour inventer un truc aussi compliqué !
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
10 juin 2015 à 21:51
Bonsoir et merci beaucoup
C'est exactement çà
Merci du temps accordé et de l'aide apporté
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 juin 2015 à 22:18
Continuons dans notre compréhension
Dans le tableau qui suit C sont les colonnes de l'image et le chiffre accolé au C le nombre de blocs départ-arrivée

Ligne = je prends la ligne
+ = je prends la valeur la plus élevée
- = je prends la valeur la moins elevée


C1 ligne
C1 ligne
C2 +
C2 -
C2 +
C2 -
C3 +
??????? on fait quoi là : on prend la valeur intermédiaire de la colonne suivante et la valeur la plus petite de la colonne suivant la précédente

Cela signifie aussi que dans le tableau d'origine une colonne image unique n'a qu'une ligne
Une colonne image doublée à 4 lignes (on prend la plus elevée du bloc de 2 puis la plus basse du bloc de 2 qui suit)
Une colonne image triplée à 9 lignes ( on prend plus élevé puis intermédiaire puis la plus basse en se déplaçant à chaque fois d'un bloc)
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
10 juin 2015 à 22:47
Bonsoir
c'est exactement ce principe
Dans mon premier commentaire çà équivaut au ligne souligné.
Merci beaucoup pour ton aide et de ta patience
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 juin 2015 à 22:52
Resalut cs_roro69
Dis moi si j'ai raison

Tu as dit :

En colonne 0 : un numéro unique ou répété
Donc en partant du départ du tableau colonne "0":
Si le numéro est unique alors
je récupère la ligne
autrement
Si le numéro est répété alors
je récupères qu'une seule ligne des numéro répété avec comme condition:
à la première ligne de la colonne "0" si le numéro est répété alors
je prends la valeur la plus haute de la colonne "1" et je conserve donc cette ligne.
Ensuite je continu et dans la série d'après quelque soit le nombre de répetition je prend la valeur inférieur à celle d'avant .
Lorsque j'arrive à la valeur la plus petite ; je redémarre avec une valeur la plus haute
jusqu'à arrivé à un numéro unique
comme ceci jusqu'à la fin du tableau.

Ce que je crois comprendre

1) ligne unique : on prend la ligne

2) ligne répété :on prend le plus haut
3) ligne suivante : on prend inférieur mais le plus proche du précédent
4) ligne suivante : on prend inférieur mais le plus proche du précédent
5) ligne suivante : on prend inférieur mais le plus proche du précédent et là mince il n'y a pas de valeur inférieure : donc on prend la valeur la plus élevée et on retourne au point 3

Si entre les points 3 et 5 on trouve une ligne unique on va au point 1 et ensuite on va au point 2 si le ligne qui arrive est répétée
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
11 juin 2015 à 08:54
Bonjour
Non ce n'est pas tout à fait çà désolé.
Je suis vraiment désolé pour le manque de clarté de ma demande et sa complexité.
Je vais tenter de reformuler ma demande.


Col1= numéro de bande dans la largeur de l'image
Col2 =Départ d'un bloc de couleur dans la hauteur de l'image
Col3=Arrivée du bloc de couleur dans la hauteur de l'image

1) Donc si colonne unique on garde ainsi
2) Si numéro de bande est répété deux fois je voudrais extraire en alternant comme ci après :

- une bande partie haute, (Valeur de départ la plus élevé)
- bande suivante réalise la partie basse, (Valeur de départ la plus petite)
- bande suivante partie haute (Valeur de départ la plus élevé)
- bande suivante réalise la partie basse(Valeur de départ la plus petite) ....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique)
Avec les codes de Whismeril ou de ShayW cette partie la fonctionne.

Par contre ce que j'aurais souhaité c'est que lorsque :

3) Si numéro de bande est répété trois fois je voudrais extraire en alternant comme ci après
- une bande partie haute, (Valeur de départ la plus élevé)
- bande suivante partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- bande suivante partie basse (Valeur de départ la plus petite)
- bande suivante réalise la partie haute(Valeur de départ la plus haute)
- bande suivante réalise la partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- bande suivante réalise la partie basse (Valeur de départ la plus petite)
....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux ,quatre ,cinq fois .

7)Si numéro de bande répété 4 fois ou + alors :
- une bande partie haute, (Valeur de départ la plus élevé)
- bande suivante partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- bande suivante partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- bande suivante partie basse (Valeur de départ la plus petite)
- bande suivante réalise la partie haute(Valeur de départ la plus haute)
- bande suivante réalise la partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- bande suivante partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- bande suivante réalise la partie basse (Valeur de départ la plus petite)
....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux ,trois ,cinq fois .

Col1= numéro de bande dans la largeur de l'image
Col2 =Départ d'un bloc de couleur dans la hauteur de l'image
Col3=Arrivée du bloc de couleur dans la hauteur de l'image
++ = je récupère la ligne


4 188 193 ++
5 188 193 ++
6 187 193 ++
7 101 116
7 186 193 ++
8 93 124 ++
8 185 193
9 90 127
9 184 193 ++
10 85 131 ++
10 184 192
11 83 133
11 183 192 ++
12 80 137 ++
12 181 192
13 79 139
13 180 192 ++
14 75 141 ++
14 179 192
15 74 143 ++
16 72 145
16 176 192 ++
17 71 146 ++
44 4 8
44 43 64
44 108 179 ++
45 3 8
45 42 63 ++
45 106 177
46 3 9 ++
46 41 61
46 102 175
47 4 10
47 41 60
47 100 176 ++
48 5 11
48 40 59 ++
48 97 177
49 40 58
49 95 177
49 5 14 ++
50 5 14
50 39 57
50 91 178 ++
51 6 14
51 39 56 ++
51 89 161
52 7 16
52 38 55
52 84 157
53 7 18
53 37 54
53 82 155
53 162 179 ++
54 7 20
54 37 53
54 77 151 ++
54 164 180
55 8 22
55 37 52 ++
55 75 149
55 164 180
56 9 25 ++
56 36 51
56 69 145
56 166 181
57 9 27 ++
58 61 139 ++
58 167 182 ++

Merci de votre patience et de votre aide et du temps conscré
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
11 juin 2015 à 09:23
tu as oublié un ++ à 52 84 157

et pour comprendre ton raisonnement il faut remplacment les phrases " et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux ,trois ,cinq fois" par " tant que la bande suivante est découpée comme la précédente"

Si ce n'est pas le cas on prend la valeur la plus haute de la bande suivante

2 découpages = plus haut plus bas en alternant bande après bande
3 découpages = plud haut, intermédiaire et plud bas en alternant bande après bande
4 découpages ou + : comme 3 découpages mais avec 2 intermédiaires

Il va de soi que pendant les découpages si le bloc suivant est un bloc de 2 et que nous sommes à l'intermédiaire d'un bloc de 3 on arrête le bloc de 3 et on commence comme pour un bloc de 2


a la fin de ton tableau tu as
58 61 139 ++
58 167 182 ++

pourquoi 2 fois la prendre

T'inquiètes on va y arriver et je suis tétu lol
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
11 juin 2015 à 09:39
Bonjour
Je te remercie vraiment de ta patience
Tu as résumé en quelque phrases exactement ce que je souhaitais.
Pour la fin du tableau erreur de ma part je ne conserve que celle ci:
58 167 182 ++
En tout cas oui je pense qu'il faut être vraiment tétu (lol)
Et merci encore pour tout le temps que tu m'accordes
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
11 juin 2015 à 11:13
Bonjour

Comme tu as dit c'est du Japonais
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
11 juin 2015 à 15:05
Salut cs_roro69

tu as oublié un ++ à 52 84 157

Je crois avoir trouvé ton bonheur !
Peux-tu m'envoyer un message perso avec ton adresse mail
A moins que tu veuilles que je le mette sur le site
C'est sérieux comme proposition
Je t'ai fait un petit programme avec une listview pour vérification

A +
0
Rejoignez-nous