Что нового

Разложение пикселей в матрицу

mv6677

Новичок
Сообщения
105
Репутация
0
Здравствуйте, господа программисты.
Подскажите решение.

Есть картинка, на которой изображена красная полоса.
Как эту картинку превратить в матрицу, где красным пикселям - соответствуют "1", а пикселям другого цвета "0" ?

(То есть чтобы сформировалась матрица как в прикрепленном файле.)
 

Вложения

  • 1.jpg
    1.jpg
    1.4 КБ · Просмотры: 146
  • матрица.jpg
    матрица.jpg
    157.6 КБ · Просмотры: 31

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
mv6677 [?]
картинку превратить в матрицу
Ответ #12 выводит все цвета в виде массива.

Замените строку
Код:
$aPixels[$i][$j] = Hex(DllStructGetData($tBits, 1, $iIndex), 8)
на нужное вам условие.

Для сохранения изображений используйте bmp или png, т.к. jpg искажает цвета.
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
InnI, по указанной вами ссылке - находится скрипт:
Код:
#include <GDIPlus.au3>

$sImage = @ScriptDir & '\test.png'

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($sImage)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

Global $iIndex, $iSize = $iWidth * $iHeight, $aPixels[$iWidth][$iHeight]
$tBits = DllStructCreate('dword[' & $iSize & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $iSize, DllStructGetPtr($tBits))
For $j = 0 To $iHeight - 1
  For $i = 0 To $iWidth - 1
    $iIndex += 1
    $aPixels[$i][$j] = Hex(DllStructGetData($tBits, 1, $iIndex), 8)
  Next
Next

_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

#include <Array.au3>
_ArrayDisplay($aPixels, Default, "", 1)

Но это - что-то не то.
Он выводит не нули или единицы, а некий текст.

А как его заставить выводить единицы для красного цвета и нули для всех остальных цветов ?
 

Вложения

  • 1.rar
    2.6 КБ · Просмотры: 4
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
Alofa , строку поменял.

Теперь выводит массив - где одни сплошные нули и нет единиц.
 

Вложения

  • 1.rar
    2.7 КБ · Просмотры: 3

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
mv6677 [?]
одни сплошные нули и нет единиц
На приложенной вами картинке 1.jpg нет красного цвета. Там много оттенков красного, но красного (255, 0, 0) нет
Код:
#include <GDIPlus.au3>

$sImage = @ScriptDir & "\1.jpg"

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($sImage)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

Global $iIndex, $iSize = $iWidth * $iHeight, $aPixels[$iHeight][$iWidth]
$tBits = DllStructCreate("dword[" & $iSize & "]")
_WinAPI_GetBitmapBits($hBitmap, 4 * $iSize, DllStructGetPtr($tBits))
For $i = 0 To $iHeight - 1
  For $j = 0 To $iWidth - 1
    $iIndex += 1
    $iColor = DllStructGetData($tBits, 1, $iIndex)
    $iRed = BitAND(BitShift($iColor, 16), 0xFF)
    $iGreen = BitAND(BitShift($iColor, 8), 0xFF)
    $iBlue = BitAND($iColor, 0xFF)
    If $iRed > 150 And $iGreen < 70 And $iBlue < 70 Then
      $aPixels[$i][$j] = 1
    Else
      $aPixels[$i][$j] = 0
    EndIf
  Next
Next
_WinAPI_DeleteObject($hBitmap)

#include <Array.au3>
_ArrayDisplay($aPixels)
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
InnI, теперь все стало понятно.
Спасибо.
 
Верх