Чтение растровых изображений как матрицы (проблема с несогласованностью в растровом изображении) - PullRequest
0 голосов
/ 16 января 2019

Что делает программа:

Я создаю программу, которая читает растровые изображения (24 бита) Ищет 0xff или 0x0 в строке растрового изображения заполняет матрицу, состоящую из нулей, с размером, равным размеру изображения изменяет правильное значение матрицы на 1 для значения 0x0. Затем он читает каждый двоичный столбец и создает строку Строка преобразуется в шестнадцатеричное и сохраняется в документе.

Изображения являются просто черно-белыми изображениями.

Вопрос:

Проблема в том, что я заставил его работать с двумя разными тестовыми изображениями, которые у меня есть. Один 8x8, и выходная сетка соответствует ожидаемой.

Другой - 17x15, и результат также является ожидаемым.

Я сделал несколько новых изображений, 11x8px, и они оказались совершенно неправильными. Где-то у меня слишком много символов в возвращенной строке растрового изображения.

Я читаю растровые изображения, игнорируя 54 первых символа, а затем удаляю любые нечетные символы, которые там добавляются. Все, что не является ни 0xff, ни 0x0, удаляется.

Тем не менее, для 11x8px у меня есть некоторые оставшиеся символы.

Проблемное изображение размером 11x8 пикселей с черными пикселями по краю и ничего больше.

Это должно быть всего 88 пикселей и в 24-битном формате должно содержать 264 записи в парах по 3 для значений BGR. После удаления 54 первых записей заголовка и удаления нечетных символов у меня 288 записей. 24 символа слишком много, и мой код не работает из-за этого .. Примеры входных данных, загруженных в виде BMP и выходных сеток. Вы можете видеть, что квадратная сетка не отображается правильно, в то время как другие отображают.

https://imgur.com/a/MJkbWl3

Строка квадратного файла BMP:

"BMV      6   (                                                                         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                                          "

Есть идеи, что происходит? Где эти 24 неуместных символа и что они означают?


Код: BmpToCharset

import numpy as np
import readBmp as ri

#test strings
str1 = "                   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      
ÿÿÿÿÿÿÿÿÿÿÿÿ                  ÿÿÿ         ÿÿÿÿÿÿ         ÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿ   
ÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"

str2 = "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÿÿ                  
ÿÿÿ         ÿÿÿÿÿÿ         ÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿ   
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"


def bmpToChar(filename,width,height):

#Get string from filename
string = ri.readBmp(filename)

#Amount of HexValues per pixel
hexValues = int(len(string)/(width*height))

if len(string)%(width*height) != 0:
    print("ERROR! Unicode string is wrong lenght.\n Lenght",len(string),"Expected multiples of",width*height,"but got",len(string)%(width*height),"unkown values")

print("------------------------------------------------------")
print("Unicode string lenght:",len(string),"\nImage width:",width,"\nImage height:",height,"\nValues per pixel: ",hexValues)

#x,y position to start at
x = 1
y = 1
#pixel counter
count = 1


#Create array with zeros:
grid = np.zeros((height,width))
print("grid:\n",grid)


#Loop through values of bitmap file
while y <=height:
    while x <=width:
        #Loop for each value in bitmap from 0 to the last hex value
        for i in range(0,hexValues):

            if hex(ord(string[count-1]))=="0xff":
                color = "white"
            else:
                color = "black"

            #Only show x value and skip the rest
            if count%hexValues == 0:
                print("Hex entry nr:",count,hex(ord(string[count-1])),"at x:",x,",","y:",y,":", "color:",color,": pixel nr:",int(count/hexValues))

                #Set correct binary value
                if color == "black":
                    binValue = 1
                else:
                    binValue = 0

                #Change value of grid:
                grid[(height-1)-(y-1),(x-1)] = binValue
                print("New grid:\n",grid)


            #else:
                #print("Hex entry nr:",count,"not divideble by", hexValues)
            count +=1
        x += 1
    x = 1
    y += 1

print("Ended loops at x:",x," y:",y)

#Print final matrix:
print("Final grid:\n",grid)



#Save grid in file
file = open('CharInHex.txt','w')

#File Syntax prefix
file.write("{{")

for j in range(0,width):
    #Reset binString to be empty
    binString = ""
    #Take current column and save it as binColumn
    binColumn = grid[:,j]
    print("\nbinColumn:",j+1,"\n",binColumn)

    #For each binary entry in the binColumn save the entry to binString

    for k in range(0,height):
        #from bottom up height-1-k. From top just k
        binString += str(int(binColumn[height-1-k]))
    print("binString of column:",binString)

    #Save as a hexa value
    hexColumn = hex(int(binString,2))
    print("hex(binString):",hexColumn)

    #Save in file
    file.write(hexColumn)
    if j != (width-1):
        file.write(",")


#File Syntax suffix
file.write("}}")
file.close()

#read file
fr = open('CharInHex.txt','r')
text = fr.read()
print("\n Saved document reads: \n",text)
fr.close()

Чтение файла и возврат строки, используемой вышеуказанной программой:

#Reads Bitmap from filename and returns the string - first 54 chars.

def readBmp(filename):

#Read file
fr = open(filename+'.bmp','r')
bmpRaw = fr.read()
#Empty Header
fileInfo = ""
#Empty Pixel BGR string
string = ""
bmpRawLen = len(bmpRaw)
oddSymbols = 0


for i in range(0,54):
    fileInfo += bmpRaw[i]
    print("bitmap raw string:",bmpRaw,"\nRaw string 
    lenght",bmpRawLen,"\nFile info:",fileInfo)
    print("----------------------------------------------------------------- 
    ----------------")

print("Displaying header info:")
for j in range(0,54):
    temp = hex(ord(fileInfo[j]))
    intVal = int(ord(fileInfo[j]))
    print("Entry:",j+1,"symbol:","'"+fileInfo[j]+"'","hex:",temp,"numeric value:",intVal)


#Create file without header:
print("\nRemoving header")
for k in range(54,bmpRawLen):
    #Show each added symbol COMMENT OUT
    print("Entry:",k+1,"symbol:","'"+bmpRaw[k]+"'","hex:",hex(ord(bmpRaw[k])),"int:",int(ord(bmpRaw[k])))

    if (int(ord(bmpRaw[k])) == 255):
        string += bmpRaw[k]
    elif (int(ord(bmpRaw[k])) == 0):
        string += bmpRaw[k]
    else:
        print("found odd symbol:","'"+bmpRaw[k]+"'","at entry:",k,"which was 
        not added to string") 
        oddSymbols += 1

print("Done. Removed header and",oddSymbols," odd symbols from rawBmp")
print("\nString without header:\n",string,"\nLenght of string:",len(string))


fr.close()
return string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...