diff --git a/src/MDFTextAccessibility.h b/src/MDFTextAccessibility.h
index 34a13d1..e119a30 100644
--- a/src/MDFTextAccessibility.h
+++ b/src/MDFTextAccessibility.h
@@ -60,33 +60,6 @@
                                 targetTextAlpha:(CGFloat)targetTextAlpha
                                            font:(nullable UIFont *)font;
 
-/**
- An optionally transparent text color suitable for displaying on a background image with a
- particular font.
-
- The color returned will be white or black with an alpha value of targetTextAlpha, unless the
- contrast ratio is insufficient, in which case the alpha is increased (made more opaque).
-
- If the passed font is nil, then a conservative guess is used.
-
- The content of the background image is simply averaged to make an average color, which is then used
- as if it were the background color of the text. Depending on the contents of the image, this
- approximation may or may not result in legible text.
-
- The supplied image region will be intersected with the image's bounds. If the resulting region is
- null or empty then this method returns nil.
-
- @param backgroundImage The opaque background image the text will be displayed on.
- @param region The region in which the text will be displayed. Can be conservatively large.
- @param targetTextAlpha The target alpha of the text.
- @param font The font to be used to display the text. Can be nil.
- @return A color with acceptable contrast ratio, or nil if the region is out of bounds of the image.
- */
-+ (nullable UIColor *)textColorOnBackgroundImage:(nonnull UIImage *)backgroundImage
-                                        inRegion:(CGRect)region
-                                 targetTextAlpha:(CGFloat)targetTextAlpha
-                                            font:(nullable UIFont *)font;
-
 #pragma mark Advanced methods
 
 /**
diff --git a/src/MDFTextAccessibility.m b/src/MDFTextAccessibility.m
index 38cf89b..fb8dcaf 100644
--- a/src/MDFTextAccessibility.m
+++ b/src/MDFTextAccessibility.m
@@ -17,7 +17,6 @@
 #import "MDFTextAccessibility.h"
 
 #import "MDFColorCalculations.h"
-#import "MDFImageCalculations.h"
 #import "NSArray+MDFUtils.h"
 
 static const CGFloat kMinContrastRatioNormalText = 4.5f;
@@ -39,20 +38,6 @@
                                   options:options];
 }
 
-+ (nullable UIColor *)textColorOnBackgroundImage:(nonnull UIImage *)backgroundImage
-                                        inRegion:(CGRect)region
-                                 targetTextAlpha:(CGFloat)targetTextAlpha
-                                            font:(nullable UIFont *)font {
-  UIColor *backgroundColor = MDFAverageColorOfOpaqueImage(backgroundImage, region);
-  if (!backgroundColor) {
-    return nil;
-  }
-
-  return [self textColorOnBackgroundColor:backgroundColor
-                          targetTextAlpha:targetTextAlpha
-                                     font:font];
-}
-
 + (nullable UIColor *)textColorOnBackgroundColor:(nonnull UIColor *)backgroundColor
                                  targetTextAlpha:(CGFloat)targetTextAlpha
                                          options:(MDFTextAccessibilityOptions)options {
diff --git a/src/private/MDFImageCalculations.h b/src/private/MDFImageCalculations.h
deleted file mode 100644
index 7cdb664..0000000
--- a/src/private/MDFImageCalculations.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- Copyright 2016-present Google Inc. All Rights Reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
-#import <UIKit/UIKit.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/**
- Return the average color of an image in a particular region.
-
- The region will be intersected with the image's bounds. If the resulting region is empty (or the
- input region was null) then this function returns nil.
-
- @param image The image to examine.
- @param region The region of the image to average, or CGRectInfinite for the entire image.
- @return The average color, or nil if the region was invalid.
- */
-UIColor *MDFAverageColorOfOpaqueImage(UIImage *image, CGRect region);
-
-#if defined __cplusplus
-}  // extern "C"
-#endif
diff --git a/src/private/MDFImageCalculations.m b/src/private/MDFImageCalculations.m
deleted file mode 100644
index d554614..0000000
--- a/src/private/MDFImageCalculations.m
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- Copyright 2016-present Google Inc. All Rights Reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
-#import "MDFImageCalculations.h"
-
-UIColor *MDFAverageColorOfOpaqueImage(UIImage *image, CGRect region) {
-  CGImageRef imageRef = image.CGImage;
-  CGImageRef cropped = CGImageCreateWithImageInRect(imageRef, region);
-
-  // Empty/null regions will cause cropped to be nil.
-  if (!cropped) {
-    return nil;
-  }
-
-  UIGraphicsBeginImageContext(CGSizeMake(1, 1));
-
-  uint8_t argb[4];
-  CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
-  CGContextRef context =
-      CGBitmapContextCreate(argb,  // data
-                            1,     // width
-                            1,     // height
-                            8,     // Bits per component
-                            4,     // Bytes per row
-                            colorspace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big);
-  CGColorSpaceRelease(colorspace);
-  CGContextSetInterpolationQuality(context, kCGInterpolationMedium);
-  CGContextSetBlendMode(context, kCGBlendModeCopy);
-  CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), cropped);
-  CGContextRelease(context);
-  CGImageRelease(cropped);
-
-  CGFloat alpha = argb[0] / (CGFloat)255;
-  CGFloat scale = alpha > 0 ? 1 / (alpha * 255) : 0;
-  UIColor *color = [UIColor colorWithRed:scale * argb[1]
-                                   green:scale * argb[2]
-                                    blue:scale * argb[3]
-                                   alpha:alpha];
-  UIGraphicsEndImageContext();
-  return color;
-}
