Zaktualizuj 'examples/example_win32_directx11/main.cpp'

This commit is contained in:
Jerzy Kwiatkowski 2023-07-06 15:44:12 +02:00
parent d4b51a8a1f
commit a0c682dc70

View File

@ -69,7 +69,7 @@ bool LoadTextureFromFile(unsigned char* image_data, int image_width, int image_h
#include <cmath> #include <cmath>
#include <vector> #include <vector>
// Funkcja dokonuj¹ca dylacji // Funkcja dokonuj¹ca dylacji
void dilation(const unsigned char* image, int width, int height, unsigned char* output) { void dilation(const unsigned char* image, int width, int height, unsigned char* output) {
int structuringElement[3][3] = { int structuringElement[3][3] = {
{0, 255, 0}, {0, 255, 0},
@ -97,7 +97,7 @@ void dilation(const unsigned char* image, int width, int height, unsigned char*
} }
} }
// Funkcja dokonuj¹ca erozji // Funkcja dokonuj¹ca erozji
void erosion(const unsigned char* image, int width, int height, unsigned char* output) { void erosion(const unsigned char* image, int width, int height, unsigned char* output) {
int structuringElement[3][3] = { int structuringElement[3][3] = {
{0, 255, 0}, {0, 255, 0},
@ -125,7 +125,7 @@ void erosion(const unsigned char* image, int width, int height, unsigned char* o
} }
} }
// Funkcja dokonuj¹ca hit-and-miss // Funkcja dokonuj¹ca hit-and-miss
void hitAndMiss(const unsigned char* image, int width, int height, unsigned char* output) { void hitAndMiss(const unsigned char* image, int width, int height, unsigned char* output) {
int structuringElement1[3][3] = { int structuringElement1[3][3] = {
{0, 0, 0}, {0, 0, 0},
@ -163,7 +163,7 @@ void hitAndMiss(const unsigned char* image, int width, int height, unsigned char
} }
} }
// Funkcja dokonuj¹ca pogrubiania // Funkcja dokonuj¹ca pogrubiania
void thickening(const unsigned char* image, int width, int height, unsigned char* output) { void thickening(const unsigned char* image, int width, int height, unsigned char* output) {
int structuringElement[3][3] = { int structuringElement[3][3] = {
{0, 255, 0}, {0, 255, 0},
@ -189,7 +189,7 @@ void thickening(const unsigned char* image, int width, int height, unsigned char
} }
} }
// Funkcja dokonuj¹ca pocieniania // Funkcja dokonuj¹ca pocieniania
void thinning(const unsigned char* image, int width, int height, unsigned char* output) { void thinning(const unsigned char* image, int width, int height, unsigned char* output) {
int structuringElement[3][3] = { int structuringElement[3][3] = {
{0, 255, 0}, {0, 255, 0},
@ -563,6 +563,10 @@ int main(int, char**)
int* colorG = nullptr; int* colorG = nullptr;
int* colorB = nullptr; int* colorB = nullptr;
static float sliderValue = 0.5f;
float xMin = 0;
float xMax = 256 * sliderValue;
while (!done) while (!done)
{ {
MSG msg; MSG msg;
@ -612,13 +616,6 @@ int main(int, char**)
ImGui::End(); ImGui::End();
} }
if (histogram)
{
ImGui::Begin("Histogram");
ImGui::End();
}
if (image_window) if (image_window)
{ {
int my_image_width = 0; int my_image_width = 0;
@ -628,22 +625,16 @@ int main(int, char**)
unsigned char* grayscaleImage = new unsigned char[my_image_width * my_image_height]; unsigned char* grayscaleImage = new unsigned char[my_image_width * my_image_height];
unsigned char* binaryImage = new unsigned char[my_image_width * my_image_height]; unsigned char* binaryImage = new unsigned char[my_image_width * my_image_height];
if (colorR == NULL && colorB == NULL && colorG == NULL) { if (colorR == NULL && colorB == NULL && colorG == NULL) {
colorR = new int[my_image_width * my_image_height]; colorR = new int[256];
colorG = new int[my_image_width * my_image_height]; colorG = new int[256];
colorB = new int[my_image_width * my_image_height]; colorB = new int[256];
int place = 0; int place = 0;
for (int y = 0; y < my_image_height; ++y) for (int i = 0; i < my_image_width * my_image_height * my_image_channels; i += my_image_channels) {
{ colorR[image_data[i]]++;
for (int x = 0; x < my_image_width; ++x) colorG[image_data[i + 1]]++;
{ colorB[image_data[i + 2]]++;
int index = (y * my_image_width + x) * 4;
colorR[place] = image_data[index];
colorG[place] = image_data[index + 1];
colorB[place++] = image_data[index + 2];
}
} }
} }
@ -676,6 +667,21 @@ int main(int, char**)
{ {
hough_transform(image_data, my_image_width, my_image_height, calculateOtsuThreshold(image_data, my_image_width, my_image_height)); hough_transform(image_data, my_image_width, my_image_height, calculateOtsuThreshold(image_data, my_image_width, my_image_height));
} }
if (histogram)
{
ImGui::Begin("Histogram");
float xMin = 0;
float xMax = 256 * sliderValue;
/*ImPlot::SetNextPlotLimitsX(xMin, xMax, ImGuiCond_Always);*/
if (ImPlot::BeginPlot("RGB Histogram")) {
ImPlot::PlotHistogram("Red", colorR, 256);
ImPlot::PlotHistogram("Green", colorG, 256);
ImPlot::PlotHistogram("Blue", colorB, 256);
ImPlot::EndPlot();
}
ImGui::SliderFloat("X-axis Range", &sliderValue, 0.0f, 1.0f);
ImGui::End();
}
if (!image_data) if (!image_data)
{ {
ImGui::Begin("Error"); ImGui::Begin("Error");
@ -689,8 +695,8 @@ int main(int, char**)
ID3D11ShaderResourceView* my_texture = NULL; ID3D11ShaderResourceView* my_texture = NULL;
if (binary == TRUE) { if (binary == TRUE) {
bool ret = LoadTextureFromFile(binaryImage, my_image_width, my_image_height, &my_texture); bool ret = LoadTextureFromFile(binaryImage, my_image_width, my_image_height, &my_texture);
stbi_image_free(binaryImage); delete[] binaryImage;
stbi_image_free(grayscaleImage); delete[] grayscaleImage;
stbi_image_free(image_data); stbi_image_free(image_data);
} }
else { else {
@ -700,8 +706,10 @@ int main(int, char**)
ImGui::Begin("Image window"); ImGui::Begin("Image window");
ImGui::Image((void*)my_texture, ImVec2(my_image_width, my_image_height)); ImGui::Image((void*)my_texture, ImVec2(my_image_width, my_image_height));
ImGui::End(); ImGui::End();
ImGui::Begin("Histograms");
ImGui::Checkbox("RGB", &histogram);
ImGui::End();
ImGui::Begin("Filters"); ImGui::Begin("Filters");
ImGui::Checkbox("Histogram", &histogram);
ImGui::Checkbox("Negative", &negative); ImGui::Checkbox("Negative", &negative);
ImGui::Checkbox("Sepia", &sepia); ImGui::Checkbox("Sepia", &sepia);
ImGui::Checkbox("Saturation", &saturation); ImGui::Checkbox("Saturation", &saturation);