Image * Filter::meanFilter(Image * img, int kernelSize) { int *** matrixImagenP = static_cast<ImagenPGM *>(img) -> getMatrix(); int height = static_cast<ImagenPGM *>(img) -> getHeight(), width = static_cast<ImagenPGM *>(img) -> getWidth(), colorDepth = static_cast<ImagenPGM *>(img) -> getColorDepth(); int ** kernel = new int *[kernelSize]; for (int i = 0; i < kernelSize; ++i) { kernel[i] = new int[kernelSize]; } for (int i = 0; i < kernelSize; ++i) { for (int j = 0; j < kernelSize; ++j) { kernel[i][j] = 1; } } // return applyKernel(kernel, kernelSize,kernelSize); ImagenPGM * imageResult = new ImagenPGM(height, width, colorDepth, applyKernel(height, width, matrixImagenP, kernel, kernelSize, kernelSize)); return imageResult; }
Image * Filter::convolutionFilter(Image * img, int ** kernel, int kernelSize) { int *** matrixImagenP = static_cast<ImagenPGM *>(img) -> getMatrix(); int height = static_cast<ImagenPGM *>(img) -> getHeight(), width = static_cast<ImagenPGM *>(img) -> getWidth(), colorDepth = static_cast<ImagenPGM *>(img) -> getColorDepth(); // return applyKernel(kernel,size,size); ImagenPGM * imageResult = new ImagenPGM(height, width, colorDepth, applyKernel(height, width, matrixImagenP, kernel, kernelSize, kernelSize)); return imageResult; }
Image * Filter::gaussianaFilter(Image * img, int kernelSize) { int *** matrixImagenP = static_cast<ImagenPGM *>(img) -> getMatrix(); int height = static_cast<ImagenPGM *>(img) -> getHeight(), width = static_cast<ImagenPGM *>(img) -> getWidth(), colorDepth = static_cast<ImagenPGM *>(img) -> getColorDepth(); int * vectorActual, *vectorAux; vectorActual = new int[kernelSize]; vectorAux = new int[kernelSize]; for (int i = 0; i < kernelSize; ++i) { for (int j = 0; j <= i; ++j) { if (i == j) { vectorAux[j] = 1; } else if (j != 0) { vectorAux[j] += vectorActual[i - j]; } } for (int r = 0; r <= i; ++r) { vectorActual[r] = vectorAux[r]; } } delete vectorAux; vectorAux = 0; // return vectorActual; // return applyKernel(createKernelFilter(vectorActual,vectorActual,kernelSize),kernelSize,kernelSize); ImagenPGM * imageResult = new ImagenPGM(height, width, colorDepth, applyKernel(height, width, matrixImagenP, createKernelFilter(vectorActual, vectorActual, kernelSize), kernelSize, kernelSize)); return imageResult; }
//applies kernel over whole canvas, should just need to define kernel in subclasses void ConvolutionFilter::applyFilter(PixelBuffer *buf, float amount, int direction) { adjustKernel(amount,direction); int i,j,width,height; ColorData tempPixel; PixelBuffer *tempBuffer; width = buf -> getWidth(); height = buf -> getHeight(); tempBuffer = new PixelBuffer(width,height,ColorData(0,0,0)); for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { applyKernel(i,j,buf, tempBuffer); } } PixelBuffer::copyPixelBuffer(tempBuffer,buf); delete tempBuffer; }
void Document::customFilter(uint size, const QString &kernelStr) { QStringList numbers = kernelStr.split(" ", QString::SkipEmptyParts); Q_ASSERT(numbers.size() == (size * size)); QVector< QVector<double> > kernel(size); double sum = 0.0; for (uint i = 0; i < size; ++i) { for (uint j = 0; j < size; ++j) { kernel[i].append(numbers[i*size + j].toDouble()); sum += kernel[i][j]; } } qDebug() << "customFilter(" << size << ", " << kernel << ")"; for (int y = m_selection.top(); y <= m_selection.bottom(); ++y) { for (int x = m_selection.left(); x <= m_selection.right(); ++x) applyKernel(m_image, x, y, kernel, sum); } setModified(true); emit repaint(m_selection); }
void ShaderInterface::drawPostSurface() { // if no fbo selected or no post program active: return if(currentFBO == -1 || postProgram == programs.end()) return; // reselect render destination FramebufferObject* fbo = fbos[currentFBO]; if(!fbo->usable()) return; // disable global program glUseProgram(0); // if a filtered image is requested: do filter post processing std::vector<ShaderProgram*> kernels = postProgram->second->getFilters(); std::vector<ShaderProgram*>::iterator kIter; for(kIter = kernels.begin(); kIter != kernels.end(); kIter++) { fbo->handleTextures(runningProgram->second->getMRTindex()); applyKernel(*kIter); } fbo->handleTextures(runningProgram->second->getMRTindex()); // reset draw and read targets if pixel copy has used them if(fbo->getAntialising()) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->getID()); postProgram->second->activateDrawBuffers(fbo->getColorBuffersExt()); glClear(GL_COLOR_BUFFER_BIT); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // set up textures for post drawing usage postProgram->second->bindTextures(fbo); // set up render environment glEnable(GL_POLYGON_SMOOTH); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 0.2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, GLfloat(-0.1)); // load and run post program glUseProgram(postProgram->second->getId()); handleUniforms(NULL, true); // render post surface glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2d(0.0, 0.0); glTexCoord2f(1.0f, 0.0f); glVertex2d(1.0, 0.0); glTexCoord2f(1.0f, 1.0f); glVertex2d(1.0, 1.0); glTexCoord2f(0.0f, 1.0f); glVertex2d(0.0, 1.0); glEnd(); glDisable(GL_POLYGON_SMOOTH); glEnable(GL_DEPTH_TEST); // revert texture units postProgram->second->unbindTextures(fbo); // copy multisample results fbo->handleTextures(postProgram->second->getMRTindex()); if(fbo->getAntialising()) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->getID()); // reenable global shader glUseProgram(runningProgram->second->getId()); }
void ShaderInterface::drawPostSurface(const bool isObjectWindow) { // disable global program glUseProgram(0); // if no fbo selected or no post program active: return if(currentFBO == -1 || postProgram == programs.end()) return; // reselect render destination FramebufferObject* fbo = fbos[currentFBO]; if(!fbo->usable()) return; // if a filtered image is requested: do filter post processing std::vector<ShaderProgram*> kernels = postProgram->second->getFilters(); std::vector<ShaderProgram*>::iterator kIter; for(kIter = kernels.begin(); kIter != kernels.end(); kIter++) { fbo->handleTextures(runningProgram->second->getMRTindex()); applyKernel(*kIter); } fbo->handleTextures(runningProgram->second->getMRTindex()); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // reset draw and read targets if pixel copy has used them if(fbo->getAntialising()) { glReadBuffer(GL_BACK); glDrawBuffer(GL_BACK); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // if renderbuffer debug is enabled // switch to multiple viewport drawing // else resize if oversized fbos are used int numTextures = postProgram->second->getNumTextures(); if(fbo_debug != -2 && numTextures > 1) { drawDebugPostSurfaces(); if(fbo_debug > -1) return; } else if(fbo_oversized) setOriginalViewport(isObjectWindow); // set up textures for post drawing usage postProgram->second->bindTextures(fbo); // set up render environment glEnable(GL_POLYGON_SMOOTH); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 0.2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, GLfloat(-0.1)); // load and run post program glUseProgram(postProgram->second->getId()); handleUniforms(NULL, true); // render post surface if(fbo_oversized) { // 20% of the rendered image is the oversize part // and should not be rendered in the final image glBegin(GL_QUADS); glTexCoord2f(0.205f, 0.205f); glVertex2d(0.0, 0.0); glTexCoord2f(0.795f, 0.205f); glVertex2d(1.0, 0.0); glTexCoord2f(0.795f, 0.795f); glVertex2d(1.0, 1.0); glTexCoord2f(0.205f, 0.795f); glVertex2d(0.0, 1.0); glEnd(); } else { glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2d(0.0, 0.0); glTexCoord2f(1.0f, 0.0f); glVertex2d(1.0, 0.0); glTexCoord2f(1.0f, 1.0f); glVertex2d(1.0, 1.0); glTexCoord2f(0.0f, 1.0f); glVertex2d(0.0, 1.0); glEnd(); } glUseProgram(0); glDisable(GL_POLYGON_SMOOTH); glEnable(GL_DEPTH_TEST); // revert texture units postProgram->second->unbindTextures(fbo); // if debugging, pop viewport attrib back again if(fbo_debug == -1 && numTextures > 1) glPopAttrib(); }