From 905d950b56d837db6258f34104f424f88b1d2691 Mon Sep 17 00:00:00 2001 From: James South Date: Wed, 24 Sep 2014 22:54:06 +0100 Subject: [PATCH] Fixing loop bounds Former-commit-id: 369c22807ca4949b98d1c6891e95bf43ab345811 --- .../EdgeDetection/ConvolutionFilter.cs | 65 ++++++++++++------ .../EdgeDetection/CostellaEdgeFilter.cs | 24 +++---- src/ImageProcessorConsole/Program.cs | 2 +- .../images/output/Bikesgray.png | Bin 17319 -> 0 bytes .../images/output/Valve_original_(1).PNG | Bin 4066 -> 0 bytes .../images/output/circle.png | Bin 7011 -> 0 bytes .../images/output/circle2.png | Bin 4407 -> 0 bytes .../images/output/monster.png.REMOVED.git-id | 1 - .../output/night-bridge.png.REMOVED.git-id | 1 - 9 files changed, 58 insertions(+), 35 deletions(-) delete mode 100644 src/ImageProcessorConsole/images/output/Bikesgray.png delete mode 100644 src/ImageProcessorConsole/images/output/Valve_original_(1).PNG delete mode 100644 src/ImageProcessorConsole/images/output/circle.png delete mode 100644 src/ImageProcessorConsole/images/output/circle2.png delete mode 100644 src/ImageProcessorConsole/images/output/monster.png.REMOVED.git-id delete mode 100644 src/ImageProcessorConsole/images/output/night-bridge.png.REMOVED.git-id diff --git a/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs index 5db8316db..b6c20ea72 100644 --- a/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs +++ b/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs @@ -83,21 +83,19 @@ namespace ImageProcessor.Imaging.EdgeDetection try { double[,] horizontalFilter = this.edgeFilter.HorizontalGradientOperator; - double[,] verticallFilter = this.edgeFilter.VerticalGradientOperator; + double[,] verticalFilter = this.edgeFilter.VerticalGradientOperator; - int filterXOffset = (horizontalFilter.GetLength(1) - 1) / 2; - int filterYOffset = (horizontalFilter.GetLength(0) - 1) / 2; - int maxWidth = width - filterXOffset; - int maxHeight = height - filterYOffset; + int kernelLength = horizontalFilter.GetLength(0); + int radius = kernelLength >> 1; using (FastBitmap sourceBitmap = new FastBitmap(input)) { using (FastBitmap destinationBitmap = new FastBitmap(destination)) { // Loop through the pixels. - for (int y = filterYOffset; y < maxHeight; y++) + for (int y = 0; y < height; y++) { - for (int x = filterXOffset; x < maxWidth; x++) + for (int x = 0; x < width; x++) { double rX = 0; double rY = 0; @@ -107,23 +105,50 @@ namespace ImageProcessor.Imaging.EdgeDetection double bY = 0; // Apply each matrix multiplier to the color components for each pixel. - for (int fy = -1; fy < filterYOffset; fy++) + for (int fy = 0; fy < kernelLength; fy++) { - for (int fx = -1; fx < filterXOffset; fx++) - { - Color currentColor = sourceBitmap.GetPixel(x + fx, y + fy); - double r = currentColor.R; - double g = currentColor.G; - double b = currentColor.B; + int fyr = fy - radius; + int offsetY = y + fyr; - rX += horizontalFilter[fy + 1, fx + 1] * r; - rY += verticallFilter[fy + 1, fx + 1] * r; + // Skip the current row + if (offsetY < 0) + { + continue; + } - gX += horizontalFilter[fy + 1, fx + 1] * g; - gY += verticallFilter[fy + 1, fx + 1] * g; + // Outwith the current bounds so break. + if (offsetY >= height) + { + break; + } - bX += horizontalFilter[fy + 1, fx + 1] * b; - bY += verticallFilter[fy + 1, fx + 1] * b; + for (int fx = 0; fx < kernelLength; fx++) + { + int fxr = fx - radius; + int offsetX = x + fxr; + + // Skip the column + if (offsetX < 0) + { + continue; + } + + if (offsetX < width) + { + Color currentColor = sourceBitmap.GetPixel(offsetX, offsetY); + double r = currentColor.R; + double g = currentColor.G; + double b = currentColor.B; + + rX += horizontalFilter[fy, fx] * r; + rY += verticalFilter[fy, fx] * r; + + gX += horizontalFilter[fy, fx] * g; + gY += verticalFilter[fy, fx] * g; + + bX += horizontalFilter[fy, fx] * b; + bY += verticalFilter[fy, fx] * b; + } } } diff --git a/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs index 96f8034ef..fe0cb4c9a 100644 --- a/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs +++ b/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs @@ -24,12 +24,12 @@ namespace ImageProcessor.Imaging.EdgeDetection { get { - return new double[,] - { { -1, -1, -1, -1, -1, }, - { -1, -1, -1, -1, -1, }, - { -1, -1, 24, -1, -1, }, - { -1, -1, -1, -1, -1, }, - { -1, -1, -1, -1, -1 }, }; + //return new double[,] + //{ { -1, -1, -1, -1, -1, }, + // { -1, -1, -1, -1, -1, }, + // { -1, -1, 24, -1, -1, }, + // { -1, -1, -1, -1, -1, }, + // { -1, -1, -1, -1, -1 }, }; return new double[,] { { -1, -3, 0, 3, 1 }, @@ -48,12 +48,12 @@ namespace ImageProcessor.Imaging.EdgeDetection { get { - return new double[,] - { { -1, -1, -1, -1, -1, }, - { -1, -1, -1, -1, -1, }, - { -1, -1, 24, -1, -1, }, - { -1, -1, -1, -1, -1, }, - { -1, -1, -1, -1, -1 }, }; + //return new double[,] + //{ { -1, -1, -1, -1, -1, }, + // { -1, -1, -1, -1, -1, }, + // { -1, -1, 24, -1, -1, }, + // { -1, -1, -1, -1, -1, }, + // { -1, -1, -1, -1, -1 }, }; return new double[,] { { 1, 1, 1, 1, 1 }, diff --git a/src/ImageProcessorConsole/Program.cs b/src/ImageProcessorConsole/Program.cs index 16a821272..ddfbdd383 100644 --- a/src/ImageProcessorConsole/Program.cs +++ b/src/ImageProcessorConsole/Program.cs @@ -77,7 +77,7 @@ namespace ImageProcessorConsole //.Constrain(size) //.ReplaceColor(Color.FromArgb(255, 1, 107, 165), Color.FromArgb(255, 1, 165, 13), 80) .Resize(layer) - .DetectEdges(new CostellaEdgeFilter(), false) + .DetectEdges(new PrewittEdgeFilter(), false) //.Filter(MatrixFilters.Comic) //.Filter(MatrixFilters.HiSatch) //.Pixelate(8) diff --git a/src/ImageProcessorConsole/images/output/Bikesgray.png b/src/ImageProcessorConsole/images/output/Bikesgray.png deleted file mode 100644 index 42aec63497de6f5474be027293e2d3253bc93bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17319 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 ~o|$NiyqvV%G<9|8Dwm<4$0T;89e8D=8NR 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 E7geDei~s-t diff --git a/src/ImageProcessorConsole/images/output/Valve_original_(1).PNG b/src/ImageProcessorConsole/images/output/Valve_original_(1).PNG deleted file mode 100644 index d6d3137334ec6e60944143bd9d9272cf7a22aaa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4066 zcmeHKYfMvT7=Bw}fEDXvVy9@UWnukisA)fDjSAUs3L=i)0s{gXfJ>pa>o3jiiJq7SQCadI61cXN7*WH~Myv`AWd$Xsh@}ag zGyCF{H^b*_i#cUDQnp4CcfUS9=kr}hIX8E__Qn0oDIFPx$X#zl9zC9wGQYjLtaQ%a z*vqemt(r73s^w04PwZy**HaI^-E%FV_tx5*T`EUYg?Q4ng#tEn3n7a%j9JTVKj z$FA0Y5&`y;=M^0+NIE@ma1+2+apPO#X#Cf>f%Ej#Lq2d%zL3KnuU)W#1^CpxD)VG8 zeekiZdIIDxZx;>%QK|Mei`zN)J802l@Lw_O+-!aZ+Jl)ZJQ)kYaZ9j4=l|K9TFBC! zKzZ=Z^!FUmq4Dk+*OGsWeB!ax8lJsB2k}*LgsZt2VJgf*0i-_9`7vIPZ;dFx{|yb7 zgtR7riL7{55{pQ+liUg>S2jb8L!Pw_mI+W&%BWapwIe8$O2xE+0=TjC3F!-sA_T1* zkZ%Q$?|DvULj;+)Ms;g^=VYb@j4C(UoTnb-HU#(cO@R%(i%5cftJGb^iz@x43I_|k zFTwDtJM=*P&R_u#@H8fc>j3pzv4a%T&S)UwnDef$_wJV3T$`kz%|YHGyWntQW;Qr> zGk9&WB)5eF-W1Xl#cz>ozH5#jipjH|M$UoH77vjcOTUraPW#M8?HP2MeZPM|p{n5J zuRui*Ez{G7bzXm5vL&3qa>T9N?ScW;AyhyREuxn2l8!%H0 zZnv#)EE+Str>o&0s%lMZM<{PtrI9x|OLIG1>&0HWFCGmN zp>@-Xeub6S)I!~6w@%l*e8j-8AH~CI zkAlD9W~oN1i?k)`vCj7`-mVpa=|D&j0r;0S{XrEqT2YKEOfRYcQ+!iPCkeO$JE zK9%N;My4vNq-}9wTKUNQ_s5vvN&5c!%pes7x+ADH<~6vw$hJg%)vZLMFL}rr1&WH1 z22s+C+yp7JS!xUn_3CN`)tGWf<=v-gpAB`FP;V4D1u~`0BTuwp9=%NIxV;(+?81Ht zyhV4PE!TO1=f#8SMZwl$N31yDcDE*K!nDF{26rM~T}=vuwWNf+ht<{6xnW@CA{A{M z?oI&W!DG&J?y13)8gJVbWuVEsf1ecal_+t6wND*v@=7tKts@3X4x)Y;eIzDbvJtG& zT5<<98?k*{`j}Ki-7Os6u?>i1^nm1dlpCsAg_>4{h%zL)CqUh5bY`>X0Eg&q@VLup zz?c0A8S2=WFPjVac4Q;m9wEaY15zjcRk=(__xw5)d^1K7D#`=<`X`>WTA_Ka!PIv4 kX-!N<&tLnuT-AM=ZHU|R<&JMIn9)-DlFXFK#UE|^9TJl=LjV8( diff --git a/src/ImageProcessorConsole/images/output/circle.png b/src/ImageProcessorConsole/images/output/circle.png deleted file mode 100644 index 663c6cfb190db6b430d184a4b5119c5184d88a4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7011 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