Repository: spark
Updated Branches:
  refs/heads/branch-2.3 26a8b4e39 -> 87d128ffd


[SPARK-23205][ML] Update ImageSchema.readImages to correctly set alpha values 
for four-channel images

## What changes were proposed in this pull request?

When parsing raw image data in ImageSchema.decode(), we use a 
[java.awt.Color](https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html#Color(int))
 constructor that sets alpha = 255, even for four-channel images (which may 
have different alpha values). This PR fixes this issue & adds a unit test to 
verify correctness of reading four-channel images.

## How was this patch tested?

Updates an existing unit test ("readImages pixel values test" in 
`ImageSchemaSuite`) to also verify correctness when reading a four-channel 
image.

Author: Sid Murching <[email protected]>

Closes #20389 from smurching/image-schema-bugfix.

(cherry picked from commit 7bd46d9871567597216cc02e1dc72ff5806ecdf8)
Signed-off-by: Sean Owen <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/87d128ff
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/87d128ff
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/87d128ff

Branch: refs/heads/branch-2.3
Commit: 87d128ffd4a56fe3995f041bf4a8c4cba6c20092
Parents: 26a8b4e
Author: Sid Murching <[email protected]>
Authored: Thu Jan 25 18:15:29 2018 -0600
Committer: Sean Owen <[email protected]>
Committed: Thu Jan 25 18:15:36 2018 -0600

----------------------------------------------------------------------
 data/mllib/images/multi-channel/BGRA_alpha_60.png    | Bin 0 -> 747 bytes
 .../org/apache/spark/ml/image/ImageSchema.scala      |   5 ++---
 .../org/apache/spark/ml/image/ImageSchemaSuite.scala |   9 ++++++---
 3 files changed, 8 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/87d128ff/data/mllib/images/multi-channel/BGRA_alpha_60.png
----------------------------------------------------------------------
diff --git a/data/mllib/images/multi-channel/BGRA_alpha_60.png 
b/data/mllib/images/multi-channel/BGRA_alpha_60.png
new file mode 100644
index 0000000..913637c
Binary files /dev/null and b/data/mllib/images/multi-channel/BGRA_alpha_60.png 
differ

http://git-wip-us.apache.org/repos/asf/spark/blob/87d128ff/mllib/src/main/scala/org/apache/spark/ml/image/ImageSchema.scala
----------------------------------------------------------------------
diff --git a/mllib/src/main/scala/org/apache/spark/ml/image/ImageSchema.scala 
b/mllib/src/main/scala/org/apache/spark/ml/image/ImageSchema.scala
index f7850b2..dcc40b6 100644
--- a/mllib/src/main/scala/org/apache/spark/ml/image/ImageSchema.scala
+++ b/mllib/src/main/scala/org/apache/spark/ml/image/ImageSchema.scala
@@ -169,12 +169,11 @@ object ImageSchema {
         var offset = 0
         for (h <- 0 until height) {
           for (w <- 0 until width) {
-            val color = new Color(img.getRGB(w, h))
-
+            val color = new Color(img.getRGB(w, h), hasAlpha)
             decoded(offset) = color.getBlue.toByte
             decoded(offset + 1) = color.getGreen.toByte
             decoded(offset + 2) = color.getRed.toByte
-            if (nChannels == 4) {
+            if (hasAlpha) {
               decoded(offset + 3) = color.getAlpha.toByte
             }
             offset += nChannels

http://git-wip-us.apache.org/repos/asf/spark/blob/87d128ff/mllib/src/test/scala/org/apache/spark/ml/image/ImageSchemaSuite.scala
----------------------------------------------------------------------
diff --git 
a/mllib/src/test/scala/org/apache/spark/ml/image/ImageSchemaSuite.scala 
b/mllib/src/test/scala/org/apache/spark/ml/image/ImageSchemaSuite.scala
index dba61cd..a8833c6 100644
--- a/mllib/src/test/scala/org/apache/spark/ml/image/ImageSchemaSuite.scala
+++ b/mllib/src/test/scala/org/apache/spark/ml/image/ImageSchemaSuite.scala
@@ -53,11 +53,11 @@ class ImageSchemaSuite extends SparkFunSuite with 
MLlibTestSparkContext {
     assert(df.count === 1)
 
     df = readImages(imagePath, null, true, -1, false, 1.0, 0)
-    assert(df.count === 9)
+    assert(df.count === 10)
 
     df = readImages(imagePath, null, true, -1, true, 1.0, 0)
     val countTotal = df.count
-    assert(countTotal === 7)
+    assert(countTotal === 8)
 
     df = readImages(imagePath, null, true, -1, true, 0.5, 0)
     // Random number about half of the size of the original dataset
@@ -103,6 +103,9 @@ class ImageSchemaSuite extends SparkFunSuite with 
MLlibTestSparkContext {
         -71, -58, -56, -73, -64))),
     "BGRA.png" -> (("CV_8UC4",
       Array[Byte](-128, -128, -8, -1, -128, -128, -8, -1, -128,
-        -128, -8, -1, 127, 127, -9, -1, 127, 127, -9, -1)))
+        -128, -8, -1, 127, 127, -9, -1, 127, 127, -9, -1))),
+    "BGRA_alpha_60.png" -> (("CV_8UC4",
+      Array[Byte](-128, -128, -8, 60, -128, -128, -8, 60, -128,
+        -128, -8, 60, 127, 127, -9, 60, 127, 127, -9, 60)))
   )
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to