Spectral analysis of images
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Spectral analysis of images
Did the regime of spectral image analysis. Integrated modes 4.7. Ask-image analysis and 4.8. Geocognition system. Designed the mode of the spectral image analysis. Help mode: '4.7. Ask-the analysis of the images by their spectra in the system of "Eidos"'
Thanks to this regime, the system of "Eidos" can:
1. To measure the spectra of graphical objects (i.e., to accurately identify colors present in the image).
2. To form the generalized spectra classes.
3. Compare concrete objects to classes according to their spectra.
4. To compare classes with each other in their spectra.
As the image spectrum on the system is considered, the proportion of pixels of different colors in the total number of pixels in an image.
This mode provides:
the image input system according to the pixels (to do this, the first two modes of the training data);
- measurement of the spectra of images with a given number of color ranges (color ranges) (4th mode of preparation data);
- a review of the characteristics of the spectrum of certain images as their characteristics in the formation of models (along with pixels);
- the conclusion of the original image with their spectra on the screen and write to files in the folder: ..\AID_DATA\InpSpectrPix\.
- the formation of the generalized spectra of images belonging to different groups, classes (generalized spectra classes);
- quantitative comparison of specific images by their generalized spectra with spectra of the classes, i.e. the solution to the identification problem
(classification, diagnostics, recognition, forecasting);
- quantitative comparison of the spectra of generalized classes to each other and solving problems cluster-constructive analysis;
- other standartnye capabilities of the system "Eidos" with the created models reflecting spectra of the images.
The source image must be in jpg or bmp format, and must reside directly in the folder: ../Aid_data/Inp_data/,
and can also be in subdirectories one level of nesting in this folder.
It is desirable that the images were no more than 450 pixels in width and 600 in height, and preferably at about 300 to 400 pix.
Work order in the system described in mode 6.4.
1. After inputting images into the system (data preparation) need to create a model in the 3rd mode, the ACK-image analysis
pixel (2.3.2.3 mode with the default settings).
2. Look at the classification of scales and gradations in 2.1 mode.
3. Look at the descriptive scales and the gradation of mode 2.2.
4. To look at a training sample in mode 2.3.1.
5. View the input file Inp_data.xls in the folder: //AID_DATA/INP_DATA/.
6. Start mode of synthesis and verification of models with the default parameters (mode 3.5).
7. View the generated model in the regime 5.5.
8. To see the accuracy of the models in mode 4.1.3.6.
9. View frequency distribution of levels of similarity with true and false positive and negative decisions (4.1.3.11).
9. To make the current one the most reliable model in the L2-criterion (5.6).
10. Start the recognition in the most reliable model in mode 4.1.2.
11. View recognition results in the modes 4.1.3.
12. To analyze the most reliable model in the 4-th subsystem.
The article author, detailing the application of this regime are in the process of preparation for printing.
http://j90540lw.beget.tech/AidosAstraX/ ... /index.htm
Thanks to this regime, the system of "Eidos" can:
1. To measure the spectra of graphical objects (i.e., to accurately identify colors present in the image).
2. To form the generalized spectra classes.
3. Compare concrete objects to classes according to their spectra.
4. To compare classes with each other in their spectra.
As the image spectrum on the system is considered, the proportion of pixels of different colors in the total number of pixels in an image.
This mode provides:
the image input system according to the pixels (to do this, the first two modes of the training data);
- measurement of the spectra of images with a given number of color ranges (color ranges) (4th mode of preparation data);
- a review of the characteristics of the spectrum of certain images as their characteristics in the formation of models (along with pixels);
- the conclusion of the original image with their spectra on the screen and write to files in the folder: ..\AID_DATA\InpSpectrPix\.
- the formation of the generalized spectra of images belonging to different groups, classes (generalized spectra classes);
- quantitative comparison of specific images by their generalized spectra with spectra of the classes, i.e. the solution to the identification problem
(classification, diagnostics, recognition, forecasting);
- quantitative comparison of the spectra of generalized classes to each other and solving problems cluster-constructive analysis;
- other standartnye capabilities of the system "Eidos" with the created models reflecting spectra of the images.
The source image must be in jpg or bmp format, and must reside directly in the folder: ../Aid_data/Inp_data/,
and can also be in subdirectories one level of nesting in this folder.
It is desirable that the images were no more than 450 pixels in width and 600 in height, and preferably at about 300 to 400 pix.
Work order in the system described in mode 6.4.
1. After inputting images into the system (data preparation) need to create a model in the 3rd mode, the ACK-image analysis
pixel (2.3.2.3 mode with the default settings).
2. Look at the classification of scales and gradations in 2.1 mode.
3. Look at the descriptive scales and the gradation of mode 2.2.
4. To look at a training sample in mode 2.3.1.
5. View the input file Inp_data.xls in the folder: //AID_DATA/INP_DATA/.
6. Start mode of synthesis and verification of models with the default parameters (mode 3.5).
7. View the generated model in the regime 5.5.
8. To see the accuracy of the models in mode 4.1.3.6.
9. View frequency distribution of levels of similarity with true and false positive and negative decisions (4.1.3.11).
9. To make the current one the most reliable model in the L2-criterion (5.6).
10. Start the recognition in the most reliable model in mode 4.1.2.
11. View recognition results in the modes 4.1.3.
12. To analyze the most reliable model in the 4-th subsystem.
The article author, detailing the application of this regime are in the process of preparation for printing.
http://j90540lw.beget.tech/AidosAstraX/ ... /index.htm
Re: Spectral analysis of images
Very nice.
Did you write that with Xbase++?
Did you write that with Xbase++?
The eXpress train is coming - and it has more cars.
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Spectral analysis of images
Hey, Roger!
This is all done in Xbase++ and to a very large extent thanks to Your help and Your functions: SetPixel() and GetPixel().
To carry out spectral analysis of the images and to create a database of results for visualization:
[/size]
Imaging and spectra of "Inp_spectr":
[/size]
This is all done in Xbase++ and to a very large extent thanks to Your help and Your functions: SetPixel() and GetPixel().
To carry out spectral analysis of the images and to create a database of results for visualization:
Code: Select all
*****************************************************************
******** 4. Создать БД "Inp_data.dbf" для программного интерфейса
******** - только пиксели
******** - только спектр
******** - пиксели и спектр
*****************************************************************
FUNCTION CreateDBF2325()
LOCAL aPixel, hDC1, GetList[0], oDialog, oProgress
nWidthMax = VAL(FileStr('_WidthMax.txt'))
nHeightMax = VAL(FileStr('_HeightMax.txt'))
IF .NOT. FILE("_FileName.arx")
LB_Warning('Необходимо выполнить п.п.1-2 данного режима', "Оцифровка изображений по всем пикселям" )
RETURN nil
ENDIF
IF .NOT. FILE("Image.dbf")
LB_Warning('Необходимо выполнить п.п.1-2 данного режима', "Оцифровка изображений по всем пикселям" )
RETURN nil
ENDIF
* DC_ASave(aFileName, "_FileName.arx")
aFileName := DC_ARestore("_FileName.arx")
* DC_ASave(aFileNmSh, "_FileNmSh.arx") // Массивы с русскими буквами считыватся не те, что записывались
aFileNmSh := DC_ARestore("_FileNmSh.arx")
* DC_DebugQout( aFileNmSh )
IF LEN(aFileName) = 0
LB_Warning('Необходимо выполнить п.п.1-2 данного режима', "Оцифровка изображений по всем пикселям" )
RETURN nil
ENDIF
IF LEN(aFileNmSh) = 0
LB_Warning('Необходимо выполнить п.п.1-2 данного режима', "Оцифровка изображений по всем пикселям" )
RETURN nil
ENDIF
***** А если считать спектр? *************
***** - только пиксели
***** - только спектр
***** - пиксели и спектр
nRadio = 2
@ 0, 0 DCGROUP oGroup1 CAPTION 'Задайте, как анализировать изображения:' SIZE 60.0, 12.5
@ 1, 2 DCRADIO nRadio VALUE 1 PROMPT '1. Только по пикселям.' PARENT oGroup1
@ 2, 2 DCRADIO nRadio VALUE 2 PROMPT '2. Только по спектру. ' PARENT oGroup1 // Доля (%) пикселей заданного диапазона цветов
@ 3, 2 DCRADIO nRadio VALUE 3 PROMPT '3. По пикселям и спектру.' PARENT oGroup1
*** Если спектр, то: "Сколько цветов в спектре?"
N_ColorSpectr = 35
@ 2.25, 30 DCSAY 'Сколько цветов в спектре?' PARENT oGroup1 EDITPROTECT {|| .NOT.nRadio=2 } HIDE {|| .NOT.nRadio=2 };@ 2.1, 51 DCSAY '' GET N_ColorSpectr PARENT oGroup1 PICTURE "###" EDITPROTECT {|| .NOT.nRadio=2 } HIDE {|| .NOT.nRadio=2 }
@ 3.25, 30 DCSAY 'Сколько цветов в спектре?' PARENT oGroup1 EDITPROTECT {|| .NOT.nRadio=3 } HIDE {|| .NOT.nRadio=3 };@ 3.1, 51 DCSAY '' GET N_ColorSpectr PARENT oGroup1 PICTURE "###" EDITPROTECT {|| .NOT.nRadio=3 } HIDE {|| .NOT.nRadio=3 }
nRadioBlack = 1
@ 4.5, 1 DCGROUP oGroup2 CAPTION 'Как кодировать черный цвет исходных изображений:' SIZE 58.0, 3.5 PARENT oGroup1 HIDE {|| .NOT. nRadio<>1}
@ 1, 2 DCRADIO nRadioBlack VALUE 1 PROMPT 'как истинно-черный цвет' PARENT oGroup2
@ 2, 2 DCRADIO nRadioBlack VALUE 2 PROMPT 'как отсутствие цвета' PARENT oGroup2
nRadioWhite = 1
@ 8.5, 1 DCGROUP oGroup3 CAPTION 'Как кодировать белый цвет исходных изображений:' SIZE 58.0, 3.5 PARENT oGroup1 HIDE {|| .NOT. nRadio<>1}
@ 1, 2 DCRADIO nRadioWhite VALUE 1 PROMPT 'как истинно-белый цвет' PARENT oGroup3
@ 2, 2 DCRADIO nRadioWhite VALUE 2 PROMPT 'как отсутствие цвета' PARENT oGroup3
DCGETOPTIONS TABSTOP
DCREAD GUI ;
TO lExit ;
FIT ;
ADDBUTTONS;
OPTIONS GetOptions ;
MODAL ;
TITLE 'АСК-анализ изображений по пикселям и спектру'
********************************************************************
IF lExit
** Button Ok
ELSE
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
** Если в папке с исполнимым модулем системы есть файл: _CloseFunct.txt, то удалить его
IF FILE('_CloseFunct.txt')
ERASE('_CloseFunct.txt')
ENDIF
**************************************************************
RETURN NIL
ENDIF
********************************************************************
IF nRadio > 1
IF N_ColorSpectr < 2
aMess := {}
AADD(aMess, 'В спектре должно быть задано не менее 2 цветов!')
AADD(aMess, 'Будет задано 35 цветов в спектре!')
LB_Warning(aMess, "Оцифровка изображений по всем пикселям" )
N_ColorSpectr = 35
ENDIF
IF N_ColorSpectr > 640
aMess := {}
AADD(aMess, 'В спектре должно быть задано не более 640 цветов, т.к.')
AADD(aMess, 'при отображении спектра используется окно 640x480 pix.')
AADD(aMess, 'Будет задано 35 цветов в спектре!')
LB_Warning(aMess, "Оцифровка изображений по всем пикселям" )
N_ColorSpectr = 35
ENDIF
ENDIF
***** Создать БД: "Inp_data.dbf" ****************************
CLOSE ALL
* SpectrInterv: 999/999-{123,123,123}
* 123456789012 R G B
* 12345678901234567890123456789012345
* 10 20 30
aStructure := { { "ScaleName", "C",35, 0 },; // Наименование шкалы
{ "Data_Type", "C", 1, 0 } } // Тип данных в шкале: N - числовой, С - символьный
FOR j=1 TO LEN(aFileNmSh)
mFieldName = "Obj"+ALLTRIM(STR(j))
mLen = MAX(8, LEN(ALLTRIM(aFileNmSh[j])))
AADD(aStructure, { mFieldName, "C", mLen, 0 } )
NEXT
DbCreate( "Inp_data.dbf", aStructure )
*************************************************************
***** Создать БД: "SpectralRanges.dbf" **********************
***** Для определения спектрального дипазона по цвету пикселя
CLOSE ALL
* SpectrInterv: 999/999-{123,123,123}
* 123456789012 R G B
* 12345678901234567890123456789012345
* 10 20 30
aStructure := { { "ScaleName", "C",35, 0 },; // Наименование шкалы
{ "fRed" , "N", 3, 0 },;
{ "fGreen" , "N", 3, 0 },;
{ "fBlue" , "N", 3, 0 } }
DbCreate( "SpectralRanges.dbf", aStructure )
*************************************************************
CLOSE ALL
USE SpectralRanges EXCLUSIVE NEW
* N_ColorSpectr // Число интервалов
ma := 127.5
mb := 127.5
mc := 127.5
mU := 0
mV := 120
mW := 240
mDelta = 360 / N_ColorSpectr
n = 360
aRed := {}
aGreen := {}
aBlue := {}
FOR j=1 TO N_ColorSpectr
mRed := INT( ma * (1 + COS( ( n + mU ) * GradRad ) ) )
mGreen := INT( mb * (1 + COS( ( n + mV ) * GradRad ) ) )
mBlue := INT( mc * (1 + COS( ( n + mW ) * GradRad ) ) )
* fColor := GraMakeRGBColor({ mRed, mGreen, mBlue })
APPEND BLANK
REPLACE ScaleName WITH "SpectrInterv: "+ALLTRIM(STR(j,15))+'/'+ALLTRIM(STR(N_ColorSpectr))+'-{'+STRTRAN(STR(mRed,3),' ','0')+','+STRTRAN(STR(mGreen,3),' ','0')+','+STRTRAN(STR(mBlue,3),' ','0')+'}'
REPLACE fRed WITH mRed
REPLACE fGreen WITH mGreen
REPLACE fBlue WITH mBlue
AADD(aRed , mRed )
AADD(aGreen, mGreen)
AADD(aBlue , mBlue )
n = n - mDelta
NEXT
***** Определение максимального размера изображения
CLOSE ALL
USE Image VIA 'FOXCDX' EXCLUSIVE NEW
nXSize = -999999999
nYSize = -999999999
aFileNmSh := {} // Короткие имена файлов
aFileXSize := {} // Размер изображения по X
aFileYSize := {} // Размер изображения по Y
DO WHILE !IMAGE->(Eof())
aPixel := Bin2Var(IMAGE->array) // Загрузка массива из БД Image
nXSize = MAX(nXSize, Len(aPixel))
nYSize = MAX(nYSize, Len(aPixel[1]))
AADD(aFileNmSh, FIELDGET(2)) // Для формирования имен классов. Вместо записи и считывания массива использовать БД
AADD(aFileXSize, Len(aPixel)) // Размер изображения по оси X
AADD(aFileYSize, Len(aPixel[1])) // Размер изображения по оси Y
IMAGE->(dbSkip())
ENDDO
***** Создание БД Inp_data с пустыми записями
CLOSE ALL
USE Inp_data EXCLUSIVE NEW
****** Наименование классификационной шкалы, тип данных в шкале, а потом значения градаций шкалы, т.е. классы
APPEND BLANK
REPLACE ScaleName WITH "Класс"
REPLACE Data_Type WITH "C" // Символьный тип данных в шкале "Класс" (а данном случае)
FOR j=1 TO LEN(aFileNmSh)
mFileNmSh = ALLTRIM(aFileNmSh[j])
mPos = AT('.bmp', mFileNmSh);IF mPos > 0;mFileNmSh = SUBSTR(mFileNmSh, 1, mPos-1);ENDIF // Взять наименование класса до расширения
mPos = AT('.BMP', mFileNmSh);IF mPos > 0;mFileNmSh = SUBSTR(mFileNmSh, 1, mPos-1);ENDIF // Взять наименование класса до расширения
mPos = AT('.jpg', mFileNmSh);IF mPos > 0;mFileNmSh = SUBSTR(mFileNmSh, 1, mPos-1);ENDIF // Взять наименование класса до расширения
mPos = AT('.JPG', mFileNmSh);IF mPos > 0;mFileNmSh = SUBSTR(mFileNmSh, 1, mPos-1);ENDIF // Взять наименование класса до расширения
mPos = AT('-' , mFileNmSh);IF mPos > 0;mFileNmSh = SUBSTR(mFileNmSh, 1, mPos-1);ENDIF // Взять наименование класса до тире, если оно есть, т.к. после тире идет номер экземляра
FIELDPUT(2+j, ALLTRIM(mFileNmSh))
* MsgBox(mFileNmSh)
NEXT
****** Это нужно для Inp_spectr.dbf для визуализации спектров
APPEND BLANK
REPLACE ScaleName WITH "Размер изображения по X"
REPLACE Data_Type WITH "N" // Размер изображения по X
FOR j=1 TO LEN(aFileNmSh)
FIELDPUT(2+j, ALLTRIM(STR(aFileXSize[j])))
NEXT
APPEND BLANK
REPLACE ScaleName WITH "Размер изображения по Y"
REPLACE Data_Type WITH "N" // Размер изображения по Y
FOR j=1 TO LEN(aFileNmSh)
FIELDPUT(2+j, ALLTRIM(STR(aFileYSize[j])))
NEXT
******* Формирование БД Inp_data.dbf *********
FOR y := 1 TO nYSize
FOR x := 1 TO nXSize
APPEND BLANK
REPLACE ScaleName WITH "Pixel("+ALLTRIM(STR(x))+","+ALLTRIM(STR(y))+")"
REPLACE Data_Type WITH "N" // Числовой тип данных в шкале "Класс" (а данном случае)
NEXT
NEXT
***** Ввод в БД Inp_data оцифрованных изображений из БД Image
CLOSE ALL
USE Image VIA 'FOXCDX' EXCLUSIVE NEW;N_Rec = RECCOUNT()
USE Inp_data EXCLUSIVE NEW
USE SpectralRanges EXCLUSIVE NEW
****************************************************************************************************
*Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time
*nMax = N_InpFiles
*Mess = '2.3.2.6. Объединение нескольких файлов исходных данных в один'
*@ 4,5 DCPROGRESS oProgress SIZE 70,1.1 MAXCOUNT nMax COLOR GRA_CLR_CYAN PERCENT EVERY 100
*DCREAD GUI TITLE Mess PARENT @oDialog FIT EXIT
*oDialog:show()
*nTime = 0
*DC_GetProgress(oProgress,0,nMax)
*FOR ff=1 TO N_InpFiles
* DC_GetProgress(oProgress, ++nTime, nMax)
*NEXT
**MsgBox('STOP')
*DC_GetProgress(oProgress,nMax,nMax)
*oDialog:Destroy()
*Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time_Time
****************************************************************************************************
nMax = N_Rec * nXSize * nYSize
Mess = 'Создание БД "Inp_data.dbf" для программного интерфейса 2.3.2.3.'
@ 4,5 DCPROGRESS oProgress SIZE 75,1.1 MAXCOUNT nMax COLOR aColor[154] PERCENT EVERY 100
DCREAD GUI TITLE Mess PARENT @oDialog FIT EXIT
oDialog:show()
nTime = 0
DC_GetProgress(oProgress,0,nMax)
aInp_name := {} // Массив с наименованиями колонок - объектов обучающей выборки, для формирования файла: Inp_name.txt
SELECT Image
DBGOTOP()
DO WHILE !IMAGE->(Eof())
aPixel := Bin2Var(IMAGE->array) // Загрузка массива из БД Image
nXSizeAr = Len(aPixel)
nYSizeAr = Len(aPixel[1])
AADD(aInp_name, ALLTRIM(IMAGE->image_name))
SELECT Image
mNumImage = RECNO()
* @ 0,0 DCSTATIC TYPE XBPSTATIC_TYPE_BITMAP ;
* COLOR nil, GRA_CLR_PALEGRAY ;
* SIZE Len(aPixel), Len(aPixel[1]) PIXEL ;
* EVAL {|o|hDC1 := GetWindowDC(o:getHWnd())}
* DCREAD GUI FIT TITLE ALLTRIM(IMAGE->image_name) ;
* EVAL {|o|TransferImageDB(hDC1, aPixel), ;
* Sleep(0), ;
* PostAppEvent(xbeP_Close,,,o)}
****** Ввод в БД Inp_data оцифрованного изображения
SELECT Inp_data
FOR y := 1 TO nYSize
FOR x := 1 TO nXSize
IF x <= nXSizeAr .AND. y <= nYSizeAr
nColor = AutomationTranslateColor(aPixel[x, y], .t.)
IF GraIsRGBColor(nColor) // Это цвет?
* aRGB = GraGetRGBIntensity(nColor) // Взаимнообратные операции преобразования формы кодирования цвета в массиве RGB и одним числом
* nColorPix = GraMakeRGBColor(aRGB)
* MsgBox(STR(nColor)+STR(nColorPix)) // nColor === nColorPix
DBGOTO(3+x+(y-1)*nXSize) // Классифкационная шкала: "Класс" и тип данных в ней (+1, т.к. 1-я строка - строка классов),
* nColor = AutomationTranslateColor(aPixel[x, y], .t.) // затем 2 строки с размерами изображения по X и по Y
nColor = aPixel[x, y]
IF nRadio > 1
IF nColor=GraMakeRGBColor({1,1,1})
IF nRadioBlack=2 // Если черный цвет и его кодировать как отсутствие цвета
nColor = 0
ENDIF
ENDIF
IF nColor=GraMakeRGBColor({255,255,255})
IF nRadioWhite=2 // Если белый цвет и его кодировать как отсутствие цвета
nColor = 0
ENDIF
ENDIF
ENDIF
FIELDPUT(2+mNumImage, ALLTRIM(STR(nColor))) // Запись цвета пикселя в текстовом формате (который в 2.3.2.3 используется для все полей)
ENDIF
ENDIF
DC_GetProgress(oProgress, ++nTime, nMax)
NEXT
NEXT
SELECT Image
DBSKIP(1)
ENDDO
*MsgBox('STOP')
DC_GetProgress(oProgress,nMax,nMax)
oDialog:Destroy()
*************************************************************** ###############################
***** Дорасчет спектров объектов в БД Inp_data.dbf ************ ###############################
*************************************************************** ###############################
IF nRadio > 1
oScrn := DC_WaitOn('Идет расчет спектров изображений. Немного подождите!')
SELECT SpectralRanges
aSpectrInterv := {}
DBGOTOP()
DO WHILE .NOT. EOF()
AADD(aSpectrInterv, ALLTRIM(ScaleName))
DBSKIP(1)
ENDDO
SELECT Inp_data
mRecnoSpectr = RECCOUNT()+1
FOR y = 1 TO N_ColorSpectr
APPEND BLANK
REPLACE ScaleName WITH aSpectrInterv[y]
REPLACE Data_Type WITH "N" // Числовой тип данных в шкале "Класс" (в данном случае)
NEXT
nMax = FCOUNT()-3
* Mess = 'Идет расчет спектров изображений. Немного подождите!'
* @ 4,5 DCPROGRESS oProgress SIZE 70,1.1 MAXCOUNT nMax COLOR aColor[155] PERCENT EVERY 100
* DCREAD GUI TITLE Mess PARENT @oDialog FIT EXIT
* oDialog:show()
* nTime = 0
* DC_GetProgress(oProgress,0,nMax)
FOR mObj = 3 TO FCOUNT()
********* Расчет массива спектра
aSpectrumAbs := {} // Массив числа пикселей объекта с цветом, попадающим в диапазон
FOR j=1 TO N_ColorSpectr
AADD(aSpectrumAbs, 0)
NEXT
mSumPix = 0
DBGOTOP()
DO WHILE .NOT. EOF()
mColor = VAL(ALLTRIM(FIELDGET(mObj))) // ПРЕОБРАЗОВАТЬ В ЧИСЛО
IF mColor > 0
// Для определения цветового диапазона, с которым наиболее сходен цвет пикселя, использовать Евклидово расстояние между цветом пикселя и цветом диапазона
* SpectrInterv: 999/999-{123,123,123}
* 123456789012 R G B
* 12345678901234567890123456789012345
* 10 20 30
nColor = AutomationTranslateColor(mColor, .t.)
aRGB = GraGetRGBIntensity(nColor) // Взаимнообратные операции преобразования формы кодирования цвета в массиве RGB и одним числом
* SELECT SpectralRanges
* mColorDistance = SQRT((aRGB[1]-&fRed)^2+(aRGB[2]-&fGreen)^2+(aRGB[3]-&fBlue)^2)
* INDEX ON STR(SQRT((aRGB[1]-&fRed)^2+(aRGB[2]-&fGreen)^2+(aRGB[3]-&fBlue)^2),8) TO SpectralRanges
* INDEX ON STR( (aRGB[1]-&fRed)^2+(aRGB[2]-&fGreen)^2+(aRGB[3]-&fBlue)^2 ,8) TO SpectralRanges
* INDEX ON STR( ABS(aRGB[1]-&fRed)+ABS(aRGB[2]-&fGreen)+ABS(aRGB[3]-&fBlue) ,8) TO SpectralRanges
mClrDistMin = 9999999
FOR j=1 TO N_ColorSpectr
mColorDistance = SQRT((aRed[j]-aRGB[1])^2+(aGreen[j]-aRGB[2])^2+(aBlue[j]-aRGB[3])^2)
IF mClrDistMin > mColorDistance
mClrDistMin = mColorDistance
mNumDistMin = j
ENDIF
NEXT
* DBGOTOP() // Для варианта с индексным массивом
* mPos1 = 15
* mPos2 = AT('/', ScaleName)-1
* mRanges = VAL(SUBSTR(ScaleName, mPos1, mPos2-mPos1+1))
aSpectrumAbs[mNumDistMin] = aSpectrumAbs[mNumDistMin] + 1
mSumPix++
ENDIF
SELECT Inp_data
DBSKIP(1)
ENDDO
********* Дорасчет массива спектра
aSpectrumPrc := {} // Массив % пикселей объекта с цветом, попадающим в диапазон, от числа всех пикселей объекта
FOR j=1 TO LEN(aSpectrumAbs)
AADD(aSpectrumPrc, aSpectrumAbs[j]/mSumPix*100)
NEXT
********* Запись массива спектра
DBGOTO(mRecnoSpectr)
FOR j=1 TO LEN(aSpectrumPrc)
FIELDPUT(mObj, ALLTRIM(STR(aSpectrumPrc[j],8,4)))
DBSKIP(1)
NEXT
* DC_GetProgress(oProgress, ++nTime, nMax)
NEXT
DC_Impl(oScrn)
* *MsgBox('STOP')
* DC_GetProgress(oProgress,nMax,nMax)
* oDialog:Destroy()
ENDIF
***** Файл: Inp_data.dbf скопировать как Inp_spectr.dbf
IF nRadio > 1
CLOSE ALL
Name_SS = "Inp_data.dbf"
Name_DD = Disk_dir+"\Inp_spectr.dbf"
COPY FILE (Name_SS) TO (Name_DD)
ENDIF
***** Файл: Inp_data.dbf скопировать в папку \AID_DATA\Inp_data
IF nRadio = 1
CLOSE ALL
USE Inp_data EXCLUSIVE NEW
DELETE FOR 1 < RECNO() .AND. RECNO() < 3
PACK
ENDIF
IF nRadio = 2
CLOSE ALL
USE Inp_data EXCLUSIVE NEW
DELETE FOR 1 < RECNO() .AND. RECNO() < mRecnoSpectr
PACK
ENDIF
CLOSE ALL
Name_SS = "Inp_data.dbf"
Name_DD = Disk_dir+"\AID_DATA\Inp_data\Inp_data.dbf"
COPY FILE (Name_SS) TO (Name_DD)
*** Сформировать файл Inp_name.txt с наименованиями колонок - объектов обучающей выборки
CrLf = CHR(13)+CHR(10) // Конец строки (абзаца) (CrLf)
mInp_name = ""
FOR j=1 TO LEN(aInp_name)
mInp_name = mInp_name + aInp_name[j] + CrLf
NEXT
StrFile( mInp_name, Disk_dir+"\AID_DATA\Inp_data\Inp_name.txt") // Записать в папку Inp_data
***** Запись БД Inp_data.dbf в виде Excel-файла с именами колонок из Inp_data.xls
***** Попробовать преобразовать Inp_data.dbf и _ColumnNames.arx в Inp_data.xls
DIRCHANGE(Disk_dir +"\AID_DATA\Inp_data\")
CLOSE ALL
USE Inp_data EXCLUSIVE NEW
SELECT Inp_data
aColumnNames := {}
AADD(aColumnNames, "Наименование шкалы")
AADD(aColumnNames, "Тип данных шкалы")
FOR j=1 TO LEN(aInp_name)
AADD(aColumnNames, aInp_name[j])
NEXT
aFields := {}
FOR j=1 TO FCOUNT()
AADD(aFields, FIELDNAME(j))
NEXT
*FUNCTION DC_WorkArea2Excel( cExcelFile, nOrientation, lDisplayAlerts, ; // Original DC
* lVisible, aFields, lAutoFit, cDateFormat, aFieldEvals, ;
* cPassword, lFreezeRow1, lCsvFallBack, aColumnNames )
// Модифицированная функция Роджера: имена колонок берутся из aColumnNames только если LEN(aFields)=LEN(aColumnNames)
// Убрана пустая строка после нанименований колонок
cExcelFile = Disk_dir +"\AID_DATA\Inp_data\Inp_data.xls" // Необходимо полное имя
DC_WorkArea2Excel(cExcelFile,,,,aFields,,,,,,, aColumnNames )
***** Сформировать файл параметров для интерфейса 2.3.2.3. (точно также сделать после Диминой программы после xls=>dbf)
*************************************************************************************************************
* aParInt[1] = 1 // XLS - MS Excel-2003
* aParInt[1] = 2 // XLSX- MS Excel-2007 (2010 и более поздние)
* aParInt[1] = 3 // DBF - DBASE IV (DBF/NTX)
* aParInt[2] = 1 // Считать нули и пробелы отсутствием данных
* aParInt[2] = 2 // Не считать нули и пробелы отсутствием данных
* aParInt[3] = номер ПЕРВОЙ строки с классификационными шкалами
* aParInt[4] = номер ПОСЛЕДНЕЙ строки с классификационными шкалами
* aParInt[5] = номер ПЕРВОЙ строки с описательными шкалами
* aParInt[6] = номер ПОСЛЕДНЕЙ строки с описательными шкалами
* aParInt[7] = 3 // число градаций в классификационной шкале
* aParInt[8] = 3 // число градаций в описательной шкале
* aParInt[9] = 1 // Формировать классификационные и описательные шкалы и градации и обучающую выборку
* aParInt[9] = 2 // Формировать только распознаваемую выборку
* aParInt[10]= 1 // Наменования ГРАДАЦИЙ числовых шкал - Только интервальные числовые значения
* aParInt[10]= 2 // Наменования ГРАДАЦИЙ числовых шкал - Только наименования интервальных числовых значений
* aParInt[10]= 3 // Наменования ГРАДАЦИЙ числовых шкал - И интервальные числовые значения, и их наименования
*************************************************************************************************************
CLOSE ALL
USE Inp_data EXCLUSIVE NEW
N_Obj = FCOUNT()-2
N_Rec = RECCOUNT()
IF FILE(Disk_dir+"\_2_3_2_3.arx") // Файл параметров
aParInt = DC_ARestore(Disk_dir+"\_2_3_2_3.arx")
aParInt[ 6] = N_Rec // номер ПОСЛЕДНЕЙ строки с описательными шкал
ELSE
PRIVATE aParInt[10]
aParInt[ 1] = 3 // DBF - DBASE IV (DBF/NTX) // Тоже будет работать
* aParInt[ 1] = 1 // XLS - MS Excel-2003
aParInt[ 2] = 1 // Считать нули и пробелы отсутствием данных (1-ДА, 2-НЕТ)
aParInt[ 3] = 1 // номер ПЕРВОЙ строки с классификационными шкалами
aParInt[ 4] = 1 // номер ПОСЛЕДНЕЙ строки с классификационными шкалами
aParInt[ 5] = 4 // номер ПЕРВОЙ строки с описательными шкалами (во 2-й стр. размер изобр.по X, а в 3-й - по Y)
aParInt[ 6] = N_Rec // номер ПОСЛЕДНЕЙ строки с описательными шкалами
aParInt[ 7] = 3 // число градаций в классификационной шкале
aParInt[ 8] = 3 // число градаций в описательной шкале
aParInt[ 9] = 1 // Формировать классификационные и описательные шкалы и градации и обучающую выборку
aParInt[10] = 1 // Наменования ГРАДАЦИЙ числовых шкал - Только интервальные числовые значения
ENDIF
DC_ASave(aParInt, Disk_dir+"\_2_3_2_3.arx")
DC_ASave(aParInt, "_2_3_2_3.arx")
DIRCHANGE(Disk_dir)
LB_Warning('БД "Inp_data.dbf" для программного интерфейса 2.3.2.3 успешно создана', "Оцифровка изображений по всем пикселям" )
RETURN nil
Imaging and spectra of "Inp_spectr":
Code: Select all
*****************************************************************
******** Визуализация изображений и их спектров из "Inp_spectr"
*****************************************************************
FUNCTION SpectrView2325()
LOCAL GetList[0], GetOptions, oSay, oDialog, oProgress, oScrn
PUBLIC oBitmap, hDC1, oPS
PUBLIC X_MaxW := 1800, Y_MaxW := 850 // Размер графического окна для самого графика в пикселях
****** Узнать разрешение экрана и не показывать изображений большой размерности ****************
nWidth := AppDeskTop():currentSize()[1] // current screen size width in pixels
nHeight := AppDeskTop():currentSize()[2] // current screen size height in pixels
IF nWidth < X_MaxW
aMess := {}
AADD(aMess, "Для правильного отображения графической формы")
AADD(aMess, "необходимо разрешение экрана: "+ALLTRIM(STR(X_MaxW))+" pix по горизонтали,")
AADD(aMess, "а фактически установлено: "+ALLTRIM(STR(nWidth))+" pix")
LB_Warning(aMess )
ReTURN NIL
ENDIF
IF nHeight < Y_MaxW
aMess := {}
AADD(aMess, "Для правильного отображения графической формы")
AADD(aMess, "необходимо разрешение экрана: "+ALLTRIM(STR(Y_MaxW))+" pix по вертикали,")
AADD(aMess, "а фактически установлено: "+ALLTRIM(STR(nHeight))+" pix")
LB_Warning(aMess )
ReTURN NIL
ENDIF
************************************************************************************************
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
** Имя графического файла для рисования
DO CASE
CASE FILE('Delone.bmp')
mFileName = 'Delone.bmp'
CASE FILE('Delone.jpg')
mFileName = 'Delone.jpg'
OTHERWISE
LB_Warning( 'В текущей папке системы'+Disk_dir+' должен быть файл: "Delone.bmp" или "Delone.jpg"','4.8. АСК-анализ изображений в системе "Эйдос"' )
RETURN nil
ENDCASE
****** Создание графического окна для рисования изображений в стиле Роджера ********************
*@ 0,0 DCSTATIC TYPE XBPSTATIC_TYPE_BITMAP CAPTION mFileName OBJECT oStatic1 ;
* PREEVAL {|o|o:autoSize := .t.} EVAL {|o|hDC1 := GetWindowDC(o:getHWnd()), o:motion := {|a,b,o|ShowColorTr( hDC1, a, oSay, o )},;
* aPixel := Array(o:caption:xSize,o:caption:ySize), o:paint := {|a,b,o|Gratest(o)}}
***** Здесь могут быть кнопки меню
*DCGETOPTIONS PIXEL
*DCREAD GUI FIT TITLE '4.7. АСК-анализ изображений в системе "Эйдос"' OPTIONS GetOptions ;
* EVAL {||GraTest(oStatic1)} SETAPPWINDOW
************************************************************************************************
***** Если нет базы данных Inp_spectr.dbf, то выдать сообщение и прекратить выполнение режима
IF .NOT.FILE('Inp_spectr.dbf')
aMess := {}
AADD(aMess, 'В текущей папке системы: '+Disk_dir+' должен быть файл: "Inp_spectr.dbf"!!!')
AADD(aMess, 'Чтобы создать этот файл необходимо выполнить подряд режимы подготовки спектрального анализа!')
LB_Warning( aMess,'4.8. АСК-анализ изображений в системе "Эйдос"' )
RETURN nil
ENDIF
IF .NOT.FILE('SpectralRanges.dbf')
aMess := {}
AADD(aMess, 'В текущей папке системы: '+Disk_dir+' должен быть файл: "SpectralRanges.dbf"!!!')
AADD(aMess, 'Чтобы создать этот файл необходимо выполнить подряд режимы подготовки спектрального анализа!')
LB_Warning( aMess,'4.8. АСК-анализ изображений в системе "Эйдос"' )
RETURN nil
ENDIF
***** Вытащить из БД размеры изображения по X и по Y и использовать и при расчете координат изображения слева #######
CLOSE ALL
USE Inp_spectr EXCLUSIVE NEW
USE SpectralRanges EXCLUSIVE NEW
****** Сформировать массивы цветов цветовых диапазонов
SELECT SpectralRanges
aSpectrIntervR := {} // Массив ЦВЕТОВ цветовых интервалов (градаций цвета)
aSpectrIntervG := {} // Массив ЦВЕТОВ цветовых интервалов (градаций цвета)
aSpectrIntervB := {} // Массив ЦВЕТОВ цветовых интервалов (градаций цвета)
DBGOTOP()
DO WHILE .NOT. EOF()
AADD(aSpectrIntervR, fRed ) // Яркость R-луча цветового диапазона
AADD(aSpectrIntervG, fGreen ) // Яркость G-луча цветового диапазона
AADD(aSpectrIntervB, fBlue ) // Яркость B-луча цветового диапазона
DBSKIP(1)
ENDDO
SELECT Inp_spectr
FOR mObj=3 TO FCOUNT()
******** ############################################################################################################
******** Визуализация исходного изображения в стиле: "Витраж" *******************************************************
******** ############################################################################################################
DBGOTO(1);mNameObj = ALLTRIM(FIELDGET(mObj))
DBGOTO(2);mXSizePix = VAL(FIELDGET(mObj))
DBGOTO(3);mYSizePix = VAL(FIELDGET(mObj))
mXSizeSpc = 640
mYSizeSpc = 480
X0pix = ROUND( ( X_MaxW - 2 * mXSizePix ) / 3 + 0.5 * mXSizePix, 0)
X0spc = ROUND( ( X_MaxW - 2 * mXSizeSpc ) / 3 * 2 + 1.5 * mXSizeSpc, 0)
Y0all = ROUND( Y_MaxW / 2 , 0)
ClearImageTr() // Стереть весь экран
**** Написать заголовок диаграммы
oFont := XbpFont():new():create('18.Arial Bold')
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER // Выравнивание символов по горизонтали по центру относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
mTitle = 'ИСХОДНОЕ ИЗОБРАЖЕНИЕ: "'+mNameObj+'" И ЕГО СПЕКТР'
GraStringAt( oPS, { X_MaxW/2, Y_MaxW-30 }, mTitle)
aSpectrIntervV := {} // Массив значенний в % цветовых интервалов (градаций цвета)
*********** Рамка вокруг изображения
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT // Тонкая сплошная линия
aAttr [ GRA_AL_COLOR ] := 1 // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraSetColor( oPS, BD_INDIGO, BD_INDIGO )
GraBox( oPS, { X0pix-mXSizePix/2-3, Y0all+mYSizePix/2+3}, { X0pix+mXSizePix/2+3, Y0all-mYSizePix/2-3 }, GRA_OUTLINE )
*********** Фон окна для изображения
GraSetColor( oPS, BD_ICEGREY, BD_ICEGREY )
GraBox( oPS, { X0pix-mXSizePix/2-1, Y0all+mYSizePix/2+1}, { X0pix+mXSizePix/2+1, Y0all-mYSizePix/2-1 }, GRA_FILL )
mSpIntVmax = -9999999
DBGOTOP()
DO WHILE .NOT. EOF()
mScName = ALLTRIM(SCALENAME)
** Извлечь из БД Inp_spectr.dbf и цвет fColor и координаты X,Y пикселя
* mScName = 'Pixel(23,11)'
* 12345
IF SUBSTR(mScName,1,5) = 'Pixel'
fColor = VAL(ALLTRIM(FIELDGET(mObj)))
* IF fColor > 0
mPos1x = 7
mPos2x = AT(',', mScName)-1
mPos1y = AT(',', mScName)+1
mPos2y = AT(')', mScName)-1
mX = VAL(SUBSTR(mScName, mPos1x, mPos2x-mPos1x+1))
mY = VAL(SUBSTR(mScName, mPos1y, mPos2y-mPos1y+1))
IF mX <= mXSizePix .AND. mY <= mYSizePix
mXpix = X0pix + VAL(SUBSTR(mScName, mPos1x, mPos2x-mPos1x+1)) - mXSizePix/2
mYpix = Y0all + VAL(SUBSTR(mScName, mPos1y, mPos2y-mPos1y+1)) - mYSizePix/2
SetPixel(hDC1,mXpix,mYpix,fColor)
ENDIF
* ENDIF
ENDIF
** Вытащить из БД данные для отображения спектра
* SpectrInterv: 999/999-{123,123,123}
* 123456789012 R G B
IF SUBSTR(mScName,1,12) = 'SpectrInterv'
mPosR1 = AT('{', mScName)+1
mPosR2 = mPosR1+2
mPosG1 = mPosR2+1
mPosG2 = mPosG1+2
mPosB1 = mPosG2+1
mPosB2 = mPosB1+2
mRed = VAL(SUBSTR(mScName, mPosR1, mPosR2-mPosR1+1))
mGreen = VAL(SUBSTR(mScName, mPosG1, mPosG2-mPosG1+1))
mBlue = VAL(SUBSTR(mScName, mPosB1, mPosB2-mPosB1+1))
* MsgBox(STR(mRed)+STR(mGreen)+STR(mBlue))
mColorV = VAL(ALLTRIM(FIELDGET(mObj)))
AADD(aSpectrIntervV, mColorV) // Доля в изображении пикселей с цветом, попадающим в этот дипазон
mSpIntVmax = MAX(mSpIntVmax, mColorV)
ENDIF
DBSKIP(1)
ENDDO
SET FILTER TO SUBSTR(ALLTRIM(ScaleName),1,12) = 'SpectrInterv'
COUNT TO mNGrad
SET FILTER TO
***** Расчет позиций центров исходного изображения и спектра
PRIVATE X0 := 0
PRIVATE Y0 := 0 // Начало координат по осям X и Y с учетом места для легенды
PRIVATE W_Wind := X_MaxW - X0 // Ширина окна для самого графика
PRIVATE H_Wind := Y_MaxW - Y0 // Высота окна для самого графика
PRIVATE Kx := mXSizeSpc / mNGrad // Коэффициент масштабирования по оси X: преобразует аргумент функции в номер пикселя по оси X
PRIVATE Ky := mYSizeSpc / mSpIntVmax // Коэффициент масштабирования по оси Y: преобразует значение функции в номер пикселя по оси Y
****** Визуализация спектра ************************
*********** Рамка вокруг изображения
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT // Тонкая сплошная линия
aAttr [ GRA_AL_COLOR ] := 1 // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
GraSetColor( oPS, BD_INDIGO, BD_INDIGO )
GraBox( oPS, { X0spc-mXSizeSpc/2-3, Y0all+mYSizeSpc/2+3}, { X0spc+mXSizeSpc/2+3, Y0all-mYSizeSpc/2-3 }, GRA_OUTLINE )
*********** Фон окна для изображения
GraSetColor( oPS, BD_ICEGREY, BD_ICEGREY )
GraBox( oPS, { X0spc-mXSizeSpc/2-1, Y0all+mYSizeSpc/2+1}, { X0spc+mXSizeSpc/2+1, Y0all-mYSizeSpc/2-1 }, GRA_FILL )
****** Надпись в верхнем ллевом углу окна спектра (макс.%)
oFont := XbpFont():new():create('14.Arial')
GraSetFont(oPS , oFont) // установить шрифт
aAttrF := ARRAY( GRA_AS_COUNT )
aAttrF [ GRA_AS_COLOR ] := GRA_CLR_BLACK
aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER // Выравнивание символов по горизонтали по центру относительно точки начала вывода
aAttrF [ GRA_AS_VERTALIGN ] := GRA_VALIGN_HALF // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
GraSetAttrString( oPS, aAttrF ) // Установить символьные атрибуты
*** Может быть сделать штук 5 интервалов по Y и сеточку пунктиром?
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DOT // Пунктир
aAttr [ GRA_AL_COLOR ] := GRA_CLR_PALEGRAY // Серого цвета
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr ) // Установить атрибуты
FOR j=0 TO mSpIntVmax STEP mSpIntVmax/5
* GraStringAt( oPS, { X0spc-mXSizeSpc/2-30, Y0all-mYSizeSpc/2+1 }, ALLTRIM(STR(0,3))+'%' )
* GraStringAt( oPS, { X0spc-mXSizeSpc/2-30, Y0all+mYSizeSpc/2+1 }, ALLTRIM(STR(mSpIntVmax,3))+'%' )
GraStringAt( oPS, { X0spc-mXSizeSpc/2-30, Y0all-mYSizeSpc/2+j * Ky }, ALLTRIM(STR(j,3))+'%' )
GraLine(oPS, { X0spc-mXSizeSpc/2 , Y0all - j * Ky + mYSizeSpc/2 }, {X0spc+mXSizeSpc/2, Y0all - j * Ky + mYSizeSpc/2} ) // Нарисовать пунктирную линию уровня y
NEXT
Column = 0
ma := 127.5
mb := 127.5
mc := 127.5
mU := 0
mV := 120
mW := 240
Delta = 360 / mNGrad
FOR c=1 TO mNGrad
***** Закрасить фон прямоугольника цветом интервала ***************
++Column
X1 := X0spc + (Column-1) * Kx - mXSizeSpc/2
Y1 := Y0all + mYSizeSpc/2
X2 := X0spc + Column * Kx - mXSizeSpc/2
Y2 := Y0all - aSpectrIntervV[c] * Ky + mYSizeSpc/2
fColor := GraMakeRGBColor({ aSpectrIntervR[c], aSpectrIntervG[c], aSpectrIntervB[c]})
FOR y=Y2 TO Y1
FOR x=X1 TO X2
SetPixel(hDC1, x, y, AutomationTranslateColor(fColor,.f.) )
NEXT
NEXT
NEXT
********* Отобразить узкую полоску спектра под реальным спектром
Delta = 360 / mNGrad
Column = 0
n = 360
FOR j=1 TO mNGrad
R := INT( ma * (1 + COS( ( n + mU ) * GradRad ) ) )
G := INT( mb * (1 + COS( ( n + mV ) * GradRad ) ) )
B := INT( mc * (1 + COS( ( n + mW ) * GradRad ) ) )
* MsgBox(STR(R)+STR(G)+STR(B))
fColor := GraMakeRGBColor({ R, G, B })
***** Закрасить фон прямоугольника ***************
GraSetColor( oPS, fColor, fColor )
++Column
X1 := X0spc + (Column-1) * Kx - mXSizeSpc/2
Y1 := Y0all - 1 * Ky - mYSizeSpc/2
X2 := X0spc + Column * Kx - mXSizeSpc/2
Y2 := Y0all - 1 * Ky - mYSizeSpc/2 - 10
GraBox( oPS, { X1, Y1 }, { X2, Y2 }, GRA_FILL)
n=n-Delta
NEXT
********* Запись изображения символа в папку с именем: "InpSpectrPix" в виде графического файла
DIRCHANGE(Disk_dir+"\Aid_data\") // Перейти в папку с исполнимым модулем системы
IF FILEDATE("InpSpectrPix",16) = CTOD("//")
DIRMAKE ("InpSpectrPix")
Mess = 'В папке текущего приложения: "#" не было директории "InpSpectrPix" для изображений и их спектров и она была создана!'
Mess = STRTRAN(Mess, "#", UPPER(ALLTRIM(M_PathAppl)))
LB_Warning(Mess, mTitle )
ENDIF
DIRCHANGE(Disk_dir+"\Aid_data\InpSpectrPix") // Перейти в папку "InpSpectrPix"
cFileName = Disk_dir+"\Aid_data\InpSpectrPix\"+ConvToAnsiCP(mNameObj)+".bmp" // Чтобы в именах файлов можно было использовать русские символы
* MsgBox(cFileName)
ERASE(cFileName)
DC_Scrn2ImageFile( oStatic1, cFileName )
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
MILLISEC(2000) // Задержка после визуализации спектра, чтобы можно было хоть немного его рассмотреть и чтобы он был виден через teamViewer
NEXT
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
** Если в папке с исполнимым модулем системы есть файл: _CloseFunct.txt, то удалить его
IF FILE('_CloseFunct.txt')
ERASE('_CloseFunct.txt')
ENDIF
**************************************************************
RETURN NIL
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Spectral analysis of images
Here's another did the modes of generalization of the spectra and comparison of spectra of specific images with generalized spectra of the classes:
http://j90540lw.beget.tech/AidosAstraX/fish1/index.htm
http://j90540lw.beget.tech/AidosAstraX/fish2/index.htm
http://j90540lw.beget.tech/AidosAstraX/fish1/index.htm
http://j90540lw.beget.tech/AidosAstraX/fish2/index.htm
Re: Spectral analysis of images
please check your Web-Site. it seems "infect" ... that is what Avira Malware Blocker say
greetings by OHR
Jimmy
Jimmy
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Spectral analysis of images
I have Avast and it's silent. Check Avira
Re: Spectral analysis of images
it is Avira Browser Add-On who show the Message.Eugene Lutsenko wrote:I have Avast and it's silent. Check Avira
just want to tell you before other do.
greetings by OHR
Jimmy
Jimmy
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Spectral analysis of images
Install Avira. Installed Avira. He also gave me this message. I think it's because on this site there are php and JAVA scripts, which define the IP and maintained a database of references to the system of Aidos: http://j90540lw.beget.tech/map4.php. After installing AVIR, this message is no longer issued.
The regime continues to work:
http://j90540lw.beget.tech/AidosAstraX/ ... /index.htm
The regime continues to work:
http://j90540lw.beget.tech/AidosAstraX/ ... /index.htm
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: Spectral analysis of images
Jimmy!
I installed AVIRA. In General I like how it works. But not like what a huge place it occupied. The folder c:\ProgramData\Avira\Antivirus\INFECTED\ has a size of 120 GB! Is there something to do?
I installed AVIRA. In General I like how it works. But not like what a huge place it occupied. The folder c:\ProgramData\Avira\Antivirus\INFECTED\ has a size of 120 GB! Is there something to do?
Re: Spectral analysis of images
you might have a lot of Virus ... or small ("unsigned") Xbase++ AppsEugene Lutsenko wrote:I installed AVIRA. In General I like how it works. But not like what a huge place it occupied. The folder c:\ProgramData\Avira\Antivirus\INFECTED\ has a size of 120 GB! Is there something to do?

same happen to me when copy Files from USB (source from other PC) to my Work PC. all under \INFECTED\ can be delete using Avira if you do not want to recover it.
so you have to EXCLUDE Directory where your (small) Xbase++ Apps are, or "signed" it, else Avria will cry

greetings by OHR
Jimmy
Jimmy