int main(void) { try { glPixelStorei(GL_UNPACK_ALIGNMENT,1); glPixelStorei(GL_PACK_ALIGNMENT,1); GLWindow::Settings setts; setts.width = screenWidth; setts.height = screenHeight; setts.match_resolution_exactly=true; setts.is_fullscreen=false; setts.glversion_major= 2; setts.glversion_minor= 1.0; GLWindow win(setts); glewInit(); LDRImage noiseImg = loadImage("noise.png",1); flipVertical(noiseImg); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glPixelStorei(GL_PACK_ALIGNMENT,1); GLTexture inputTex(noiseImg); int width = noiseImg.getDimensions()[1]; int height = noiseImg.getDimensions()[2]; std::cout<<"W H "<<width<<" "<<height<<std::endl; glBindTexture(GL_TEXTURE_2D, inputTex.tex); writeImage(noiseImg, "noiseOut_test.png"); GL::GLShader median2("median.vert", "medianfilter2.frag"); median2.bind(); median2.setTexture("tex", 0); median2.setUniform("invTexDimensions", 1.0f / float(width), 1.0f / float(height)); GL::GLShader median3("median.vert", "medianfilter3.frag"); median3.bind(); median3.setTexture("tex", 0); median3.setUniform("invTexDimensions", 1.0f / float(width), 1.0f / float(height)); GL::GLShader median4("median.vert", "medianfilter4.frag"); median4.bind(); median4.setTexture("tex", 0); median4.setUniform("invTexDimensions", 1.0f / float(width), 1.0f / float(height)); GL::GLShader median5("median.vert", "medianfilter5.frag"); median5.bind(); median5.setTexture("tex", 0); median5.setUniform("invTexDimensions", 1.0f / float(width), 1.0f / float(height)); median4.bind(); std::cout<<"BEGIN "<<std::endl; { while(win.isValid()) { /* #ifndef GL_ES_BUILD const GLenum buffers[]= {GL_COLOR_ATTACHMENT0, GL_BACK_LEFT}; glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glDrawBuffers(1, &buffers[1]); #else*/ glBindFramebuffer(GL_FRAMEBUFFER, 0); //#endif glClearColor(1,0,0,1); glClear(GL_COLOR_BUFFER_BIT); screenQuad(); // checkFBOErrors(); win.update(); win.flush(); } }//scope } catch(const std::exception& e) { std::cout<<e.what()<<std::endl; } catch(const std::string& str) { std::cout<<str<<std::endl; } return 0; }
void medianFilter(int size, int width, RGB *image, int window, int start, int end, int rank){ int thing = (window - 1)/2; int windowsq = window*window; int topleft, current; int pc, i, j, cpypx; // Storage for the R, G, and B values in the window int rvalues[windowsq]; int gvalues[windowsq]; int bvalues[windowsq]; RGB *unmodified = (RGB*)malloc(size*sizeof(RGB)); RGB *current_pixel; RGB *copydestpixel; RGB *copysrcpixel; RGB *pixel; // Deep copy unmodified <- img for (i=0; i < size; i++) { copydestpixel = unmodified + i; copysrcpixel = image + i; copydestpixel->r = copysrcpixel->r; copydestpixel->g = copysrcpixel->g; copydestpixel->b = copysrcpixel->b; } // For each pixel in this worker's quota for (pc = start; pc < end; pc ++) { // Current pixel of interest pixel = image + pc; // Pixel at top left of window topleft = pc - (thing * width) - thing; // Reset R, G, and B values to 0's memset(rvalues, 0, sizeof(int)*windowsq); memset(gvalues, 0, sizeof(int)*windowsq); memset(bvalues, 0, sizeof(int)*windowsq); int count = 1; // For each row in window for (i=0; i < window; i ++) { // For each column in window for (j=0; j < window; j ++) { // Determine the pixel we're looking at current = topleft + i * width - thing + j + 1; // If current pixel is outside range of window and image, skip it if (current < 0 || current > size -1 || (current % width) > (pc % width) + thing) { // Do nothing // If current pixel is in range of window and image } else { current_pixel = unmodified + current; rvalues[count - 1] = current_pixel->r; gvalues[count - 1] = current_pixel->g; bvalues[count - 1] = current_pixel->b; count = count + 1; } } } pixel->r = median2(count, rvalues); pixel->g = median2(count, gvalues); pixel->b = median2(count, bvalues); } }