AlbumShaper
1.0a3
|
Go to the source code of this file.
Functions | |
void | computeCoeffs (float sigma) |
void | fillBuffer (QImage &image, int channel) |
void | blurBuffer () |
void | blurRow (int row) |
void | blurColumn (int column) |
void | blurRegionsInRow (int y) |
void | blurRegionsInCol (int x) |
void | resetImageData (QImage &image, int channel, bool blurEdges) |
float | edgeValue (int x, int y) |
void | blurImage (QImage &image, float sigma) |
void | blurImage (QImage &image, float sigma, QPoint offset, QSize fullImageRes, QImage *edges, int *regions, int numRegions, bool targetEdges) |
int | regionIndex (int x, int y) |
Variables | |
float | q |
float | b0 |
float | b1 |
float | b2 |
float | b3 |
float | B |
int | width |
int | height |
float * | buffer |
float * | rowBuffer |
float * | colBuffer |
float * | regionRowBuffer |
float * | regionColBuffer |
QImage * | edgeImage |
int * | regionMap |
int | regionCount |
QPoint | displayOffset |
QSize | fullRes |
void blurBuffer | ( | ) |
Definition at line 204 of file blur.cpp.
References blurColumn(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), edgeImage, height, regionMap, and width.
Referenced by blurImage().
{ //blur rows, then columns int index; if(regionMap == NULL || edgeImage == NULL ) { for(index=0; index < height; index++) { blurRow( index ); } for(index=0; index< width; index++) { blurColumn( index ); } } else { for(index=0; index < height; index++) { blurRegionsInRow( index ); } for(index=0; index< width; index++) { blurRegionsInCol( index ); } } }
void blurColumn | ( | int | column | ) |
Definition at line 409 of file blur.cpp.
References B, b0, b1, b2, b3, buffer, colBuffer, height, and width.
Referenced by blurBuffer().
{ int i; //forward colBuffer[0] = buffer[ column + 0*width ]; for(i=1; i<height; i++) { colBuffer[i] = B*buffer[ column + i*width ] + ( b1 * colBuffer[ QMAX(i-1, 0) ] + b2 * colBuffer[ QMAX(i-2, 0) ] + b3 * colBuffer[ QMAX(i-3, 0) ]) / b0; } //reverse for(i=height-1; i>=0; i--) { buffer[ column + i*width ] = B*colBuffer[ i ] + ( b1 * buffer[ column + QMIN(i+1, height-1)*width ] + b2 * buffer[ column + QMIN(i+2, height-1)*width ] + b3 * buffer[ column + QMIN(i+3, height-1)*width ]) / b0; } }
void blurImage | ( | QImage & | image, |
float | sigma | ||
) |
Definition at line 94 of file blur.cpp.
References blurImage().
Referenced by GrainEditor::adjustImage(), blurImage(), EdgeDetect::constructEdgeImage(), and sharpenImage().
{ //supply dummy data for edges, notably NULL for the edge image pointer. //other values have no effect blurImage( image, sigma, QPoint(0,0), image.size(), NULL, NULL, 0, false ); }
void blurImage | ( | QImage & | image, |
float | sigma, | ||
QPoint | offset, | ||
QSize | fullImageRes, | ||
QImage * | edges, | ||
int * | regions, | ||
int | numRegions, | ||
bool | targetEdges | ||
) |
Definition at line 101 of file blur.cpp.
References blurBuffer(), buffer, colBuffer, computeCoeffs(), displayOffset, edgeImage, fillBuffer(), fullRes, height, regionColBuffer, regionCount, regionMap, regionRowBuffer, resetImageData(), rowBuffer, and width.
{ edgeImage = edges; regionMap = regions; regionCount = numRegions; displayOffset = offset; fullRes = fullImageRes; //compute blurring coeffecients computeCoeffs(sigma); //store image dimensions width = image.width(); height = image.height(); //Construct float buffer that is the size of the image/ //In order to conserve memory process image three times, once for //each color channel. buffer = new float[ width * height ]; rowBuffer = new float[width]; colBuffer = new float[height]; regionRowBuffer = new float[width * numRegions]; regionColBuffer = new float[height * numRegions]; //iterate over each color channel int channel; for( channel = 0; channel <=2; channel++) { //copy color data into float buffer fillBuffer( image, channel ); //blur buffer data blurBuffer(); //reset image data used blurred buffer resetImageData(image, channel, targetEdges); } //delete buffer delete[] buffer; delete[] rowBuffer; delete[] colBuffer; }
void blurRegionsInCol | ( | int | x | ) |
Definition at line 434 of file blur.cpp.
References B, b0, b1, b2, b3, buffer, colBuffer, height, regionColBuffer, regionCount, regionIndex(), regionMap, and width.
Referenced by blurBuffer().
{ //--------------------------------- //populate region col buffer. a col has been allocated for //each region. Pixels between regions //take the closest pixel value in that col from that region // int yTimesWidth = y*width; int regionTimesHeight; int region,y,y2; //for each region for(region=0; region<regionCount; region++) { regionTimesHeight = region*height; int lastY = -1; for(y=0; y<height; y++) { //if pixel belongs to this region then update lastY index and copy value over //if lastY is more than one pixel away than fill inbetween region if( region == regionMap[regionIndex(x, y)] ) { //fill empty region preceeding this region blob if( lastY < y-1) { //no preceeding region, spread left! if(lastY == -1) { for(y2=0; y2<y; y2++) { regionColBuffer[y2 + regionTimesHeight] = buffer[x + y*width]; } } //else spread from both left and right of empty stretch else { int yMid = lastY + ((y-1) - lastY)/2; for(y2=lastY+1; y2<=yMid; y2++) { regionColBuffer[y2 + regionTimesHeight] = buffer[x + lastY*width]; } for(y2=yMid+1; y2<y; y2++) { regionColBuffer[y2 + regionTimesHeight] = buffer[x + y*width]; } } } regionColBuffer[y + regionTimesHeight] = buffer[x + y*width]; lastY = y; } } //y //if last stretch is empty, fill right if( region != regionMap[regionIndex(x, height-1)] ) { for(y2=lastY+1; y2<height; y2++) { regionColBuffer[y2 + regionTimesHeight] = buffer[x + lastY*width]; } } } //region //--------------------------------- //blur the region col buffers //for each region for(region=0; region<regionCount; region++) { regionTimesHeight = region*height; //forward colBuffer[0] = regionColBuffer[ 0 + regionTimesHeight ]; for(y=1; y<height; y++) { colBuffer[y] = B*regionColBuffer[ y + regionTimesHeight ] + ( b1 * colBuffer[ QMAX(y-1, 0) ] + b2 * colBuffer[ QMAX(y-2, 0) ] + b3 * colBuffer[ QMAX(y-3, 0) ]) / b0; } //reverse for(y=height-1; y>=0; y--) { regionColBuffer[ y + regionTimesHeight ] = B*colBuffer[ y ] + ( b1 * regionColBuffer[ QMIN(y+1, height-1) + regionTimesHeight ] + b2 * regionColBuffer[ QMIN(y+2, height-1) + regionTimesHeight ] + b3 * regionColBuffer[ QMIN(y+3, height-1) + regionTimesHeight ]) / b0; } } //--------------------------------- //copy data from the region row buffers back to the //buffer. for each pixel we choose the correct region //row buffer basedon the original regionidentity of hte pixel for(y=0; y<height; y++) { buffer[x + y*width] = regionColBuffer[y + regionMap[regionIndex(x,y)]*height]; } //--------------------------------- }
void blurRegionsInRow | ( | int | y | ) |
Definition at line 311 of file blur.cpp.
References B, b0, b1, b2, b3, buffer, regionCount, regionIndex(), regionMap, regionRowBuffer, rowBuffer, and width.
Referenced by blurBuffer().
{ //--------------------------------- //populate region row buffer. a row has been allocated for //each region. Pixels between regions //take the closest pixel value in that row from that region int yTimesWidth = y*width; int regionTimesWidth; int region,x,x2; //for each region for(region=0; region<regionCount; region++) { regionTimesWidth = region*width; int lastX = -1; for(x=0; x<width; x++) { //if pixel belongs to this region then update lastX index and copy value over //if lastX is mroe than one pixel away than fill inbetween region if( region == regionMap[regionIndex(x, y)] ) { //fill empty region preceeding this region blob if( lastX < x-1) { //no preceeding region, spread left! if(lastX == -1) { for(x2=0; x2<x; x2++) { regionRowBuffer[x2 + regionTimesWidth] = buffer[x + yTimesWidth]; } } //else spread from both left and right of empty stretch else { int xMid = lastX + ((x-1) - lastX)/2; for(x2=lastX+1; x2<=xMid; x2++) { regionRowBuffer[x2 + regionTimesWidth] = buffer[lastX + yTimesWidth]; } for(x2=xMid+1; x2<x; x2++) { regionRowBuffer[x2 + regionTimesWidth] = buffer[x + yTimesWidth]; } } } regionRowBuffer[x + regionTimesWidth] = buffer[x + yTimesWidth]; lastX = x; } } //x //if last stretch is empty, fill right if( region != regionMap[regionIndex(width-1, y)] ) { for(x2=lastX+1; x2<width; x2++) { regionRowBuffer[x2 + regionTimesWidth] = buffer[lastX + yTimesWidth]; } } } //region //--------------------------------- //blur the region row buffers //for each region for(region=0; region<regionCount; region++) { regionTimesWidth = region*width; //forward rowBuffer[0] = regionRowBuffer[ 0 + regionTimesWidth ]; for(x=1; x<width; x++) { rowBuffer[x] = B*regionRowBuffer[ x + regionTimesWidth ] + ( b1*rowBuffer[ QMAX(x-1, 0) ] + b2 * rowBuffer[ QMAX(x-2, 0) ] + b3 * rowBuffer[ QMAX(x-3, 0) ]) / b0; } //reverse for(x=width-1; x>=0; x--) { regionRowBuffer[ x + regionTimesWidth ] = B*rowBuffer[ x ] + ( b1 * regionRowBuffer[ QMIN(x+1, width-1) + regionTimesWidth ] + b2 * regionRowBuffer[ QMIN(x+2, width-1) + regionTimesWidth ] + b3 * regionRowBuffer[ QMIN(x+3, width-1) + regionTimesWidth ]) / b0; } } //--------------------------------- //copy data from the region row buffers back to the //buffer. for each pixel we choose the correct region //row buffer basedon the original regionidentity of hte pixel for(x=0; x<width; x++) { int ri = regionIndex(x,y); int region = regionMap[ri]; float bufferVal = regionRowBuffer[ x + region*width ]; buffer[x + yTimesWidth] = bufferVal; // buffer[x + yTimesWidth] = regionRowBuffer[x + regionMap[regionIndex(x,y)]*width]; } //--------------------------------- }
void blurRow | ( | int | row | ) |
Definition at line 285 of file blur.cpp.
References B, b0, b1, b2, b3, buffer, rowBuffer, and width.
Referenced by blurBuffer().
{ int i; int rtw = row*width; //forward rowBuffer[0] = buffer[ 0 + rtw ]; for(i=1; i<width; i++) { rowBuffer[i] = B*buffer[ i + rtw ] + ( b1*rowBuffer[ QMAX(i-1, 0) ] + b2 * rowBuffer[ QMAX(i-2, 0) ] + b3 * rowBuffer[ QMAX(i-3, 0) ]) / b0; } //reverse for(i=width-1; i>=0; i--) { buffer[ i + rtw ] = B*rowBuffer[ i ] + ( b1 * buffer[ QMIN(i+1, width-1) + rtw ] + b2 * buffer[ QMIN(i+2, width-1) + rtw ] + b3 * buffer[ QMIN(i+3, width-1) + rtw ]) / b0; } }
void computeCoeffs | ( | float | sigma | ) |
Definition at line 150 of file blur.cpp.
References B, b0, b1, b2, b3, and q.
Referenced by blurImage().
{ //compute q as a function of sigma if( sigma >= 2.5f ) { q = 0.98711f*sigma - 0.96330f; } else { q = 3.97156f - 4.14554f * sqrt( 1.0f - 0.26891f*sigma ); } //compute b0, b1, b2, and b3 b0 = 1.57825f + (2.44413f*q) + (1.4281f * q*q ) + (0.422205f * q*q*q ); b1 = (2.44413f * q) + (2.85619f * q*q) + (1.26661 * q*q*q ); b2 = -((1.4281 * q*q) + (1.26661 * q*q*q)); b3 = 0.422205 * q*q*q; //compute B B = 1.0f - ((b1 + b2 + b3) / b0); }
float edgeValue | ( | int | x, |
int | y | ||
) |
Definition at line 234 of file blur.cpp.
References displayOffset, edgeImage, and fullRes.
Referenced by resetImageData().
{ //compute floating point x and y coordinates for edge image float edgeX = ((edgeImage->width()-1.0f) * (x+displayOffset.x())) / (fullRes.width()-1); float edgeY = ((edgeImage->height()-1.0f) * (y+displayOffset.y())) / (fullRes.height()-1); //compute 4 int values of coordinates int x1 = (int)edgeX; int y1 = (int)edgeY; int x2, y2; if( edgeX > x1 ) x2 = x1+1; else x2 = x1; if( edgeY > y1 ) y2 = y1+1; else y2 = y1; //compute the four indices int index1, index2, index3, index4; index1 = x1 + y1*edgeImage->width(); index2 = x2 + y1*edgeImage->width(); index3 = x1 + y2*edgeImage->width(); index4 = x2 + y2*edgeImage->width(); //find edge quantity for each corner float v1, v2, v3, v4; uchar* scanline = edgeImage->scanLine( y1 ); QRgb* rgb = ((QRgb*)scanline+x1); v1 = ((float) qRed( *rgb )) / 255.0f; rgb = ((QRgb*)scanline+x2); v2 = ((float) qRed( *rgb )) / 255.0f; scanline = edgeImage->scanLine( y2 ); rgb = ((QRgb*)scanline+x1); v3 = ((float) qRed( *rgb )) / 255.0f; rgb = ((QRgb*)scanline+x2); v4 = ((float) qRed( *rgb )) / 255.0f; //blur combine left-right v1 = (edgeX-x1)*v2 + (1 - edgeX + x1)*v1; v3 = (edgeX-x1)*v4 + (1 - edgeX + x1)*v3; //combine top-bottom v1 = (edgeY-y1)*v3 + (1 - edgeY + y1)*v1; //return result return v1; }
void fillBuffer | ( | QImage & | image, |
int | channel | ||
) |
Definition at line 172 of file blur.cpp.
References buffer.
Referenced by blurImage().
{ //precompute 1/255 float multiplier = 1.0f / 255.0f; //iterate over each selected scanline int x, y; QRgb* rgb; uchar* scanLine; for( y=0; y<image.height(); y++) { //iterate over each pixel in scanline scanLine = image.scanLine(y); for( x=0; x<image.width(); x++) { //get handle on rgb value in image rgb = ((QRgb*)scanLine+x); //compute index where float value is stored in buffer int index = x + y*image.width(); //convert and store correct channel in buffer if( channel == 0 ) buffer[index] = multiplier * qRed( *rgb ); else if( channel == 1 ) buffer[index] = multiplier * qGreen( *rgb ); else buffer[index] = multiplier * qBlue( *rgb ); } //x } //y }
int regionIndex | ( | int | x, |
int | y | ||
) |
Definition at line 227 of file blur.cpp.
References displayOffset, edgeImage, and fullRes.
Referenced by blurRegionsInCol(), blurRegionsInRow(), and IDedPixel().
{ int edgeX = ((edgeImage->width()-1) * (x+displayOffset.x())) / (fullRes.width()-1); int edgeY = ((edgeImage->height()-1) * (y+displayOffset.y())) / (fullRes.height()-1); return edgeY*edgeImage->width() + edgeX; }
void resetImageData | ( | QImage & | image, |
int | channel, | ||
bool | blurEdges | ||
) |
Definition at line 527 of file blur.cpp.
References buffer, edgeImage, and edgeValue().
Referenced by blurImage().
{ //iterate over each selected scanline int x, y; QRgb *rgb; uchar* imageScanline = NULL; for( y=0; y<image.height(); y++) { imageScanline = image.scanLine(y); for( x=0; x<image.width(); x++) { //get handle on rgb value in image rgb = ((QRgb*)imageScanline+x); //compute index where float value is stored in buffer int index = x + y*image.width(); //convert blured value to 0-255 range int blurredColor = QMAX( QMIN( ((int) (255*buffer[index])), 255 ), 0 ); //blur the entire thing! float alpha; if( edgeImage == NULL) alpha = 1.0f; else { alpha = edgeValue( x, y ); if(!blurEdges) alpha = 1.0f - alpha; } //convert and store correct channel in buffer if( channel == 0 ) *rgb = qRgb( (int) (alpha*blurredColor + (1-alpha)*qRed(*rgb)), qGreen(*rgb), qBlue(*rgb) ); else if( channel == 1 ) *rgb = qRgb( qRed(*rgb), (int) (alpha*blurredColor + (1-alpha)*qGreen(*rgb)), qBlue(*rgb) ); else *rgb = qRgb( qRed(*rgb), qGreen(*rgb), (int) (alpha*blurredColor + (1-alpha)*qBlue(*rgb)) ); } //x } //y }
float B |
Definition at line 78 of file blur.cpp.
Referenced by blurColumn(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), EdgeDetect::computeClusterThresholds(), and computeCoeffs().
float b0 |
Definition at line 78 of file blur.cpp.
Referenced by blurColumn(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), and computeCoeffs().
float b1 |
Definition at line 78 of file blur.cpp.
Referenced by blurColumn(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), computeCoeffs(), and sharpenImage().
float b2 |
Definition at line 78 of file blur.cpp.
Referenced by blurColumn(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), computeCoeffs(), and sharpenImage().
float b3 |
Definition at line 78 of file blur.cpp.
Referenced by blurColumn(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), and computeCoeffs().
float* buffer |
Definition at line 80 of file blur.cpp.
Referenced by blurColumn(), blurImage(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), copyFile(), SubalbumsIconView::dragObject(), fillBuffer(), ClickableLabel::paintEvent(), SelectionPlacementInterface::paintEvent(), HistogramInterface::paintEvent(), SplitViewInterface::paintEvent(), SelectionInterface::paintEvent(), PhotoPreviewWidget::paintItem(), SubalbumPreviewWidget::paintItem(), and resetImageData().
float* colBuffer |
Definition at line 82 of file blur.cpp.
Referenced by blurColumn(), blurImage(), and blurRegionsInCol().
QPoint displayOffset |
Definition at line 90 of file blur.cpp.
Referenced by blurImage(), edgeValue(), and regionIndex().
QImage* edgeImage |
Definition at line 87 of file blur.cpp.
Referenced by blurBuffer(), blurImage(), edgeValue(), regionIndex(), and resetImageData().
QSize fullRes |
Definition at line 91 of file blur.cpp.
Referenced by blurImage(), edgeValue(), and regionIndex().
int height |
Definition at line 79 of file blur.cpp.
Referenced by blurBuffer(), blurColumn(), blurImage(), blurRegionsInCol(), PhotoPreviewWidget::compare(), SelectionInterface::constructDisplayImages(), EdgeDetect::constructEdgeImage(), SelectionInterface::ConvertDisplayToImageCoordinate(), SelectionInterface::ConvertImageToDisplayCoordinate(), SelectionInterface::cropSelectedPoint(), SubalbumPreviewWidget::dropped(), getImageSize(), PhotoPreviewWidget::getPhotoInfoRect(), interpolatedPixelValue(), main(), SelectionInterface::mouseActionByPosition(), ClickableLabel::mouseMoveEvent(), SplitViewInterface::mouseMoveEvent(), ClickableLabel::mouseReleaseEvent(), SplitViewInterface::nearSplitPoint(), SelectionPlacementInterface::overRegion(), PhotoPreviewWidget::paint(), SelectionPlacementInterface::paintEvent(), SplitViewInterface::paintEvent(), SelectionInterface::paintEvent(), Item::paintItem(), GroupIcon::paintItem(), PhotoPreviewWidget::paintItem(), SubalbumPreviewWidget::paintItem(), pixelValid(), pointillismEffect(), SelectionPlacementInterface::recenterSelection(), ScaledPreviewInterface::resizeEvent(), LayoutSettingsWidget::setDefaults(), Item::setTextWidth(), SliderToolTip::update(), and Window::~Window().
float q |
Definition at line 78 of file blur.cpp.
Referenced by computeCoeffs(), and HSVtoRGB().
float* regionColBuffer |
Definition at line 85 of file blur.cpp.
Referenced by blurImage(), and blurRegionsInCol().
int regionCount |
Definition at line 89 of file blur.cpp.
Referenced by blurImage(), blurRegionsInCol(), and blurRegionsInRow().
int* regionMap |
Definition at line 88 of file blur.cpp.
Referenced by blurBuffer(), blurImage(), blurRegionsInCol(), and blurRegionsInRow().
float* regionRowBuffer |
Definition at line 84 of file blur.cpp.
Referenced by blurImage(), and blurRegionsInRow().
float* rowBuffer |
Definition at line 81 of file blur.cpp.
Referenced by blurImage(), blurRegionsInRow(), and blurRow().
int width |
Definition at line 79 of file blur.cpp.
Referenced by ALabel::animate(), blurBuffer(), blurColumn(), blurImage(), blurRegionsInCol(), blurRegionsInRow(), blurRow(), SelectionInterface::constructDisplayImages(), EdgeDetect::constructEdgeImage(), SelectionInterface::ConvertDisplayToImageCoordinate(), SelectionInterface::ConvertImageToDisplayCoordinate(), SelectionInterface::cropSelectedPoint(), HistogramInterface::displayToIndex(), TitleWidget::dropEvent(), PhotosIconView::findNearestUnselectedPhoto(), getImageSize(), PhotoPreviewWidget::getPhotoInfoRect(), HistogramInterface::indexToDisplay(), interpolatedPixelValue(), main(), SelectionInterface::mouseActionByPosition(), ClickableLabel::mouseMoveEvent(), SplitViewInterface::mouseMoveEvent(), HistogramInterface::mouseMoveEvent(), ClickableLabel::mouseReleaseEvent(), SplitViewInterface::nearSplitPoint(), SelectionPlacementInterface::overRegion(), PhotoPreviewWidget::paint(), SelectionPlacementInterface::paintEvent(), SplitViewInterface::paintEvent(), HistogramInterface::paintEvent(), SelectionInterface::paintEvent(), PhotoPreviewWidget::paintItem(), SubalbumPreviewWidget::paintItem(), pixelValid(), pointillismEffect(), SelectionPlacementInterface::recenterSelection(), TitleWidget::refreshOpenRecentMenu(), ScaledPreviewInterface::resizeEvent(), LayoutSettingsWidget::setDefaults(), SliderToolTip::update(), and Window::~Window().