Patent Publication Number: US-2021191970-A1

Title: DNA-Based Image Storage and Retrieval

Description:
CROSS-REFERENCE TO RELATED APPLICATION 
     This application claims priority to U.S. provisional patent application no. 62/951,105, filed Dec. 20, 2019, which is hereby incorporated by reference in its entirety. 
    
    
     STATEMENT REGARDING FEDERALLY SPONSORED RESEARCH OR DEVELOPMENT 
     This invention was made with government support under Grant No. AF894_019_000_20190116151220 awarded by Defense Advanced Research Projects Association. The government has certain rights in the invention. 
    
    
     BACKGROUND 
     The main obstacles for the practical deployment of deoxyribonucleic acid (DNA) based data storage platforms are the prohibitively high cost of synthetic DNA and the large number of errors introduced during synthesis. In particular, synthetic DNA products contain both individual oligo (nucleotide fragment) symbol errors as well as missing DNA oligo errors, with rates that exceed those of modern storage systems by orders of magnitude. These errors can be corrected either through the use of a large number of redundant oligos or through cycles of writing, reading, and rewriting of information that eliminate the errors. Both approaches add to the overall storage cost and are hence undesirable. 
     SUMMARY 
     The embodiments herein store quantized images in DNA and use signal processing and machine learning techniques to deal with error and cost issues without resorting to the use of redundant oligos or rewriting. These embodiments rely on decoupling the reed-green-blue (RGB) channels of images, performing specialized quantization and compression on the individual color channels, and using new discoloration detection and image inpainting techniques. The performance of this approach is shown experimentally on a collection of movie posters stored in DNA, and establishes the efficacy thereof. 
     Accordingly, a first example embodiment may involve: (i) obtaining an image composed of color channels including a red color channel, a green color channel, and a blue color channel, wherein each of the color channels represents colors therein with n bits per pixel; (ii) quantizing each of the color channels to be represented by m bits per pixel, wherein m is less than n; (iii) using a space-filling curve to convert each of the color channels as quantized into respective vectors including a red channel vector, a green channel vector, and a blue channel vector, wherein entries in each of the respective vectors are represented by m bits; (iv) generating, for each of the respective vectors, a respective set of m arrays, wherein the m arrays for a particular vector of the respective vectors contain indices of where a fixed value selected from a range of 0 to m-1 is found in the particular vector, and wherein the indices are in increasing order; (v) applying, to each of the m arrays for each of the respective vectors, differential encoding of the indices therein; (vi) compressing each of the m arrays for each of the respective vectors; (vii) mapping each of the m arrays for each of the respective vectors to blocks of nucleotides, wherein each block contains a unique block identifier representing a location in the m arrays of the respective vectors; (viii) synthesizing the blocks of nucleotides; and (ix) storing, in a DNA-based storage medium, the blocks of nucleotides. 
     In a second example embodiment, an article of manufacture may include a non-transitory computer-readable medium, having stored thereon program instructions that, upon execution by a computing system, cause the computing system to perform operations in accordance with the first example embodiment. 
     In a third example embodiment, a computing system may include at least one processor, as well as memory and program instructions. The program instructions may be stored in the memory, and upon execution by the at least one processor, cause the computing system to perform operations in accordance with the first example embodiment. 
     In a fourth example embodiment, a system may include various means for carrying out each of the operations of the first example embodiment. 
     These, as well as other embodiments, aspects, advantages, and alternatives, will become apparent to those of ordinary skill in the art by reading the following detailed description, with reference where appropriate to the accompanying drawings. Further, this summary and other descriptions and figures provided herein are intended to illustrate embodiments by way of example only and, as such, that numerous variations are possible. For instance, structural elements and process steps can be rearranged, combined, distributed, eliminated, or otherwise changed, while remaining within the scope of the embodiments as claimed. 
    
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
         FIG. 1  illustrates Hilbert curves for 2×2 and 4×4 squares, in accordance with example embodiments. 
         FIG. 2  illustrates a schematic drawing of the encoding procedure, in accordance with example embodiments. 
         FIG. 3  illustrates an original image compared to a reconstructed image with discolorations, in accordance with example embodiments. 
         FIG. 4  illustrates non-overlapping errors in different color channels of the image encoded in DNA, in accordance with example embodiments. 
         FIG. 5A  is a histogram of the values in the matrix R-G, in accordance with example embodiments. 
         FIG. 5B  is an illustration of a corrupted image, in accordance with example embodiments. 
         FIG. 5C  is an illustration of discolored regions in the red channel of an image that have been whitened out, in accordance with example embodiments. 
         FIG. 5D  is an illustration of an erroneous image reconstruction with masking, in accordance with example embodiments. 
         FIG. 5E  is an illustration of the Image of the mask, in accordance with example embodiments. 
         FIG. 6A  is an illustration of the image with inpainting before smoothing, in accordance with example embodiments. 
         FIG. 6B  is an illustration of the image with inpainting after smoothing, in accordance with example embodiments. 
         FIG. 6C  is an illustration of the refined output of the inpainting procedure, in accordance with example embodiments. 
         FIG. 6D  illustrates a schematic drawing of the refining procedure, in accordance with example embodiments. 
         FIG. 7  illustrates a schematic drawing of a computing device, in accordance with example embodiments. 
         FIG. 8  illustrates a schematic drawing of a server device cluster, in accordance with example embodiments. 
         FIG. 9  is a flow chart, in accordance with example embodiments. 
         FIG. 10  includes images read from a DNA-based storage medium, in accordance with example embodiments. 
         FIG. 11  also includes images read from a DNA-based storage medium, in accordance with example embodiments. 
         FIG. 12  depicts a redundancy encoding, in accordance with example embodiments. 
         FIG. 13  includes an image that was encoded with redundancy and read from a DNA-based storage medium, in accordance with example embodiments. 
         FIG. 14  includes another image that was encoded with redundancy and read from a DNA-based storage medium, in accordance with example embodiments. 
     
    
    
     DETAILED DESCRIPTION 
     Example methods, devices, and systems are described herein. It should be understood that the words “example” and “exemplary” are used herein to mean “serving as an example, instance, or illustration.” Any embodiment or feature described herein as being an “example” or “exemplary” is not necessarily to be construed as preferred or advantageous over other embodiments or features unless stated as such. Thus, other embodiments can be utilized and other changes can be made without departing from the scope of the subject matter presented herein. 
     Accordingly, the example embodiments described herein are not meant to be limiting. It will be readily understood that the aspects of the present disclosure, as generally described herein, and illustrated in the figures, can be arranged, substituted, combined, separated, and designed in a wide variety of different configurations. For example, the separation of features into “client” and “server” components may occur in a number of ways. 
     Further, unless context suggests otherwise, the features illustrated in each of the figures may be used in combination with one another. Thus, the figures should be generally viewed as component aspects of one or more overall embodiments, with the understanding that not all illustrated features are necessary for each embodiment. 
     Additionally, any enumeration of elements, blocks, or steps in this specification or the claims is for purposes of clarity. Thus, such enumeration should not be interpreted to require or imply that these elements, blocks, or steps adhere to a particular arrangement or are carried out in a particular order. 
     I. INTRODUCTION 
     DNA-based data storage has recently emerged as a viable alternative to classical storage devices that can be used to record bits at a nanoscale level and preserve them in a nonvolatile fashion for thousands of years. Representative DNA-based storage technology has been described in U.S. patent application Ser. Nos. 15/356,118 and 15/789,519, both of which are incorporated by reference in their entirety herein. 
     Almost all existing DNA-based data recording architectures store user content in synthetic DNA strands of length 100-1000 base pairs, organized within large unordered pools, and retrieve desired information via next-generation (e.g., HiSeq and MiSeq) or third-generation nanopore sequencing. Although DNA sequencing can be performed at a very low cost, de novo synthesis of DNA oligos with a predetermined content still represents a major bottleneck of the platform. Synthetic DNA platforms are prohibitively expensive compared to existing optical and magnetic media. Furthermore, synthetic DNA-based storage systems have error-rates of the order of 10 −3  that by far exceed those of existing high-density recorders. Synthesis errors include both symbol errors as well as missing oligo errors which are unique to this type of storage media and refer to the fact that one may not be able to cover all substrings of the user-defined string. Missing oligos represent serious obstacles to accurate data retrieval as they may affect more than 20% of the product. To address this type of error, proposals have included using Reed-Solomon codes at both the oligo and pool of oligo level to ensure that missing strings may be reconstructed from combinations of redundantly encoded oligos. Unfortunately, adding redundant oligos further increases the cost of the system as the oligos have to be sequenced to determine the missing oligo rate in order to add the correct amount of redundancy. 
     The embodiments herein cover a new means of archiving images in DNA in which the missing and erroneous oligos are corrected through specialized learning methods, rather than expensive coding redundancy. First, colored images are quantized and compressed by specialized encoding methods that separately operate on the three color channels, red, green, and blue (herein after “RGB”). The quantization scheme reduces the image color pallet to 8 intensity levels per channel, and compresses intensity levels through a combination of Hilbert-space filling curves, differential and Huffman coding. In some embodiments, less quantization and more intensity levels (e.g., 16, 32, 64, 128) may be used. 
     Given that compression may lead to catastrophic error-propagation in the presence of missing or mismatched oligos, sparsely spaced markers are also introduced into the oligo codes in order to resynchronize positional pixel information when this is lost. No error-correcting redundancy is added to the pool in order to further save in synthesis cost, and instead, the retrieved corrupted images are subjected to specialized image processing techniques that lead to barely distorted outputs. The scheme combines automatic detection of discolorations in images with inpainting based on EdgeConnect and smoothing via bilateral filtering. The proposed DNA image processing scheme was tested on a pool of 11,826 oligos of length 196 basepairs each, purchased from Integrated DNA Technologies (IDT). 
     II. THE COLOR IMAGE ENCODING PROCEDURE 
     The two-step encoding procedure first translates an image file into 24 binary strings, and then converts the binary strings into DNA oligos for storage and amplification. A detailed description of each step used in the process is provided below. 
     Converting image files to binary strings. The first step in the procedure is RGB channel separation and quantization. First, the color images are split into three color channels, red (R), green (G), and blue (B), and then 3-bit quantization is performed on the values in each channel. More precisely, the image I is represented by a three-dimension tensor of size m×n×3, i.e., I∈[256] m×n×3 , which is split into three matrices R, G, B of size m×n each. Next, 3-bit quantization of each color matrix is performed, leading to intensity values mapped from 0-255 to 0-7. More specifically, the following quantization rule is used for all three channels: 
     
       
         
           
             
               
                 X 
                  
                 
                   [ 
                   
                     p 
                     , 
                     q 
                   
                   ] 
                 
               
               = 
               
                 
                   
                     floor 
                     ( 
                     
                       
                         
                           X 
                            
                           
                             [ 
                             
                               p 
                               , 
                               q 
                             
                             ] 
                           
                         
                         × 
                         8 
                       
                       256 
                     
                     ) 
                   
                    
                   
                     ∀ 
                   
                    
                   p 
                 
                 ∈ 
                 
                   [ 
                   m 
                   ] 
                 
               
             
             , 
             
               q 
               ∈ 
               
                 [ 
                 n 
                 ] 
               
             
             , 
           
         
       
     
     where X∈[8] m×n  is the quantized matrix for X∈{R, G, B}. 
     Converting 2D images into 1D oligo strings. There exist several methods for converting a matrix into a string so as to nearly-optimally preserve two dimensional image distances in the one dimensional domain, such as the Hilbert and Peano space-filling curve. The Hilbert space-filling curve, shown in  FIG. 1 , provides a good means to capture two dimensional locality and is the method of choice in the conversion process. Note that the Hilbert curve is used on square images, so the transversal implementation is adapted to account for matrices with arbitrary dimensions. After the mapping, the matrices R, G, B are converted into vectors V R , V G , V B , respectively. 
     Partitioning color channels according to levels. Upon quantization, the values in V R , V G , V B  lie in {0, . . . , 7}. Next, each vector is decomposed into strings of possibly different lengths according to the intensity value. Specifically, V R  is decomposed into L R,0 , . . . , L R,7 , where the vector L R,j  contains the indices of the elements in V R  whose value equals j, j∈[8]; the same procedure is performed for the vectors V G , V B . An example decomposition may read as: 
     
       
         
           
             
               V 
               R 
             
             = 
             
               
                 
                   [ 
                   
                     0 
                     , 
                     0 
                     , 
                     0 
                     , 
                     1 
                     , 
                     7 
                     , 
                     6 
                     , 
                     7 
                     , 
                     7 
                     , 
                     … 
                   
                    
                   
                       
                   
                   ] 
                 
                 - 
               
               → 
               
                 
                   
                     
                       
                         L 
                         
                           R 
                           , 
                           O 
                         
                       
                       = 
                       
                         [ 
                         
                           0 
                           , 
                           1 
                           , 
                           2 
                           , 
                           … 
                         
                          
                         
                             
                         
                         ] 
                       
                     
                   
                 
                 
                   
                     ⋮ 
                   
                 
                 
                   
                     
                       
                         L 
                         
                           R 
                           , 
                           7 
                         
                       
                       = 
                       
                         [ 
                         
                           4 
                           , 
                           6 
                           , 
                           7 
                           , 
                           … 
                         
                          
                         
                             
                         
                         ] 
                       
                     
                   
                 
               
             
           
         
       
     
     Note that the elements in V i  are assigned to L i,j  in order, i∈{R, G, B}, 0≤j≤7. Hence, each vector L i,j  contains increasing values, a fact that is exploited in the reconstruction procedure. Given the Hilbert scan, it is expected that the differences between adjacent entries in each of the vectors L i,j  is small with high probability. Therefore, splitting a vector into individual levels enables subsequent differential encoding. Moreover, since the level information is split among different vectors, distortions can be corrected in the images in the presence of errors. In summary, after the RGB decomposition and level partition, each image is represented by 24 vectors. Differential encoding converts a string into another string containing the initial value of the original and the differences between consecutive values, summarized in vectors denoted by D i,j . In order to prevent catastrophic error propagation, 3% of the values in each D i,j  were set to their original undifferentiated values and prepend to the symbol −1. An additional −2 was appended to each D i,j  to indicate the end of the vector. For example, a typical pair of L i,j  and D i,j  may be of the form: 
     
       
         
           
             
               L 
               
                 i 
                 , 
                 j 
               
             
             = 
             
               
                 
                   [ 
                   
                     
                       x 
                       1 
                     
                     , 
                     
                       x 
                       2 
                     
                     , 
                     … 
                      
                     
                         
                     
                     , 
                     
                       x 
                       31 
                     
                     , 
                     
                       x 
                       32 
                     
                     , 
                     … 
                   
                    
                   
                       
                   
                   ] 
                 
                  
                 
                   
 
                 
                 ↓ 
                 
                   
 
                 
                  
                 
                   D 
                   
                     i 
                     , 
                     j 
                   
                 
               
               = 
               
                 
                   [ 
                   
                     
                       - 
                       1 
                     
                     , 
                     
                       x 
                       1 
                     
                     , 
                     
                       
                         x 
                         2 
                       
                       - 
                       
                         x 
                         1 
                       
                     
                     , 
                     … 
                      
                     
                         
                     
                     , 
                     
                       - 
                       1 
                     
                     , 
                     
                       x 
                       31 
                     
                     , 
                     
                       
                         x 
                         32 
                       
                       - 
                       
                         x 
                         31 
                       
                     
                     , 
                     … 
                      
                     
                         
                     
                     , 
                     
                       - 
                       2 
                     
                   
                   ] 
                 
                 . 
               
             
           
         
       
     
     Note that as L i,j  has increasing values, the symbols −1 and −2 cannot be confused with information-bearing values in D i,j . Huffman coding is performed after differential coding, and all values in D i,j  are used to construct the Huffman code dictionary. This results in a collection of binary strings B i,j , i∈{R, G, B}, 0≤j≤7. 
     Conversion of binary strings into DNA oligos. The binary information is converted into oligo strings over the alphabet {A,T,G,C} of length 196 nucleotides. Each oligo contains a unique block-id for its position in the original string. If needed, some strings are padded with dummy values to ensure uniform lengths. Once again, −2 is used to indicate the end of the vector. In addition, each DNA oligo includes a prefix primer, address, an information block and suffix primer. 
     Mapping binary sequences to DNA blocks. To produce a high quality of the synthetic product, constraint coding is performed by imposing a maximum runlength-3 constraint for the symbols C and G and ensuring a GC content in the range 40-60%. The constrained coder maps 18 and 22-bit sequences into 10 and 13 nucleotide DNA oligos, respectively. This constrained code, along with the color code, is the only source of redundancy in the encoding procedure. 
     Primer sequences. A prefix and suffix primer, used for polymerase chain reaction (herein after “PCR”) amplification of the single stranded DNA oligos, is added to each DNA oligo. Eight pairs of primers of length 20, one for each level, all of which are at a Hamming distance ≥10 nucleotides, are chosen to allow for random access. The primers are paired up so as to have similar melting temperature, which allows for all oligos to be amplified in the same cycle. 
     Address sequences. Strings of length 13 are added to the DNA oligos following the primers in order to represent the address of the information blocks contained. The first 3 nucleotides of the address encode the color (RGB). Since color information is highly important for reconstruction, the color information is presented in redundant form as R=‘ATC’, G=‘TCG’, B=‘GAT’. This allows for single-error correction in the color code. The second part of the address is of length 10 nucleotides, encoding an 18-bit binary string including the index of the corresponding image file, the index of the color level and the index of the information block within that level. 
     Information blocks are added to the oligos between the address and suffix primer, including 11 blocks of length 13 nucleotides. The total length of the information block is 143 nucleotides. Overall, with the compression scheme and additional addressing information added, 8,654,400 bits of the original images are converted into 2,317,896 nucleotides. The encoding steps are summarized in  FIG. 2 . 
     III. DNA IMAGE PROCESSING AND EXPERIMENTS 
     The 11,826 DNA oPools oligos were ordered from IDT. They were PCR-amplified and the PCR products were then converted into a shotgun sequencing library with the Hyper Library construction kit from Kapa Biosystems (Roche). The library was quantitated by a quantitative polymerase chain reaction (qPCR) and sequenced on one ISeq flow cell for 251 cycles from one end of the fragments. The fast file was generated with the Illumina bcl2fastq v2.20 conversion software. As each oligo read may contain errors that arise both during synthesis and sequencing, a consensus sequence was first reconstructed via sequence alignment to exploit the inherent redundancy of the read process. After the whole writing, reading and consensus process, 10,981 perfectly reconstructed oligos were obtained, 745 oligos with symbol errors that do not cause obvious defects in the reconstructed images, and 100 oligos with large corruption levels or completely missing from the pool. 
     The decoding procedure operates on the consensus reads and reverses the two-step encoding process. 
     Converting DNA consensus strings into binary strings. During the conversion of DNA consensus strings to binary strings, if some oligo unique identifiers are corrupted by errors during the synthesis or sequencing process, the erroneous identifier is replaced by a unique string at smallest Hamming distance from it. Each DNA block is converted into some binary string, although this string may be wrong and cause visible discolorations in the image. 
     Image processing. An example illustrating the image corruptions caused by erroneous/missing oligos is shown in  FIG. 3 . Small blocks, only 10 missing oligos, with the wrong color can be easily observed visually. The discolorations can be corrected automatically with a three-part image processing procedure. The first step is detecting the locations with discolorations, masking the regions with discolorations and subsequently treating them as missing pixels. The second step involves using deep learning techniques to inpaint the missing pixels. The third step involves smoothing the image to reduce both blocking effects caused by aggressive quantization and the mismatched inpainted pixels. 
     Automatic discoloration detection. Detecting arbitrarily shaped discolorations is a difficult problem in computer vision that has not been successfully addressed for classical image processing systems. This is due to the fact that discolored pixels usually have simultaneous distortions in all three color channels of possibly different degrees. However, detecting discolorations in DNA-encoded images is possible since, with high probability, only one of the three color channels will be corrupted due to independent encoding of the RGB components and these components not necessarily being close to each other when stored. Thus, when two of the three channels are smooth in a particular region and the third channel is not smooth in that region (e.g., with pixel values that vary by more than a pre-determined extent), the variations in the third channel are likely due to error. Thus, the third channel can be smoothed to improve the color quality of the image in the region. 
       FIG. 4  illustrates this fact, as erroneous pixels in different channels do not overlap. Within the correct color channels, pixels have neighbors of similar level, while within the erroneous channel, pixels have values that differ significantly from those of their neighbors.  FIGS. 5A, 5B, and 5C  illustrate that pixels with the smallest t=15 frequencies in the difference vectors indeed correspond to almost all erroneous regions in the red channel. The results of the detection scheme are depicted in  FIGS. 5D and 5E , for t=18. Note that the whitened out regions are treated as missing data, and filled in using inpainting techniques. 
     Image inpainting, or image completion, is a method for filling out missing regions in an image. There exist several methods for image inpainting currently in use, including diffusion-based, patch-based and deep learning approaches. The former two methods use local or nonlocal information only within the target image itself which leads to poor performance when trying to recover complex details in large images. On the other hand, deep-learning methods such as EdgeConnect combine edges in the missing regions with color and texture information from the remainder of the image to fill in the missing pixels. Since the encoded movie posters have obvious edge structures, the images were inpainted using EdgeConnect with the result shown in  FIG. 6A . 
     Smoothing. Although the problem of discoloration may be addressed through inpainting, the reconstructed images still suffer from mismatched inpaints and blocking effect caused by quantization. To further improve the image quality, smoothing is performed through bilateral filtering that tends to preserve the edges structures. The smoothing equations read as: 
     
       
         
           
             
               
                 
                   I 
                   ^ 
                 
                  
                 
                   [ 
                   
                     i 
                     , 
                     j 
                   
                   ] 
                 
               
               = 
               
                 
                   
                     ∑ 
                     
                       
                         [ 
                         
                           k 
                           , 
                           l 
                         
                         ] 
                       
                       ∈ 
                       Ω 
                     
                   
                    
                   
                     
                       I 
                        
                       
                         [ 
                         
                           k 
                           , 
                           l 
                         
                         ] 
                       
                     
                      
                     
                       w 
                        
                       
                         ( 
                         
                           i 
                           , 
                           j 
                           , 
                           k 
                           , 
                           l 
                         
                         ) 
                       
                     
                   
                 
                 
                   
                     ∑ 
                     
                       
                         [ 
                         
                           k 
                           , 
                           l 
                         
                         ] 
                       
                       ∈ 
                       Ω 
                     
                   
                    
                   
                     w 
                      
                     
                       ( 
                       
                         i 
                         , 
                         j 
                         , 
                         k 
                         , 
                         l 
                       
                       ) 
                     
                   
                 
               
             
             , 
             
               
 
             
              
             
               
                 w 
                  
                 
                   ( 
                   
                     i 
                     , 
                     j 
                     , 
                     k 
                     , 
                     l 
                   
                   ) 
                 
               
               = 
               
                 exp 
                 ( 
                 
                   
                     - 
                     
                       
                         
                           
                             ( 
                             
                               i 
                               - 
                               k 
                             
                             ) 
                           
                           2 
                         
                         + 
                         
                           
                             ( 
                             
                               j 
                               - 
                               l 
                             
                             ) 
                           
                           2 
                         
                       
                       
                         2 
                          
                         
                             
                         
                          
                         
                           σ 
                           d 
                           2 
                         
                       
                     
                   
                   - 
                   
                     
                       
                          
                         
                           
                             I 
                              
                             
                               [ 
                               
                                 i 
                                 , 
                                 j 
                               
                               ] 
                             
                           
                           - 
                           
                             I 
                              
                             
                               [ 
                               
                                 k 
                                 , 
                                 l 
                               
                               ] 
                             
                           
                         
                          
                       
                       2 
                     
                     
                       2 
                        
                       
                           
                       
                        
                       
                         σ 
                         r 
                         2 
                       
                     
                   
                 
                 ) 
               
             
             , 
           
         
       
     
     where I denotes the original image and Î the filtered image, Ω is some predefined window centered at the coordinates [i, j], and σ r  and σ d  are parameters that control the smoothing differences for intensities and coordinates, respectively. The filter performs Gaussian blurring on background regions but respects edge boundaries in the image. The result of smoothing with σ d   2 =σ r   2 =45 and Ω of the form of a 9×9 square is shown in  FIG. 6B , and no obvious discolorations are detectable. Furthermore, in order to address other possible impairments, the positions of error blocks, obtained from the discoloration detection platform, were used to perform adaptive median smoothing around erroneous regions. The output of this iterative process is illustrated in  FIGS. 6C and 6D . 
     IV. EXAMPLE COMPUTING DEVICES AND CLOUD-BASED COMPUTING ENVIRONMENTS 
     The following embodiments describe architectural and operational aspects of example computing devices and systems that may employ the disclosed implementations, as well as the features and advantages thereof. Notably, at least some aspects of the embodiments herein may operate at least in part on computing devices or systems with the characteristics described below. 
       FIG. 7  is a simplified block diagram exemplifying a computing device  700 , illustrating some of the components that could be included in a computing device arranged to operate in accordance with the embodiments herein. Computing device  700  could be a client device (e.g., a device actively operated by a user), a server device (e.g., a device that provides computational services to client devices), or some other type of computational platform. Some server devices may operate as client devices from time to time in order to perform particular operations, and some client devices may incorporate server features. 
     In this example, computing device  700  includes processor  702 , memory  704 , network interface  706 , and an input/output unit  708 , all of which may be coupled by a system bus  710  or a similar mechanism. In some embodiments, computing device  700  may include other components and/or peripheral devices (e.g., detachable storage, printers, and so on). 
     Processor  702  may be one or more of any type of computer processing element, such as a central processing unit (CPU), a co-processor (e.g., a mathematics, graphics, or encryption co-processor), a digital signal processor (DSP), a network processor, and/or a form of integrated circuit or controller that performs processor operations. In some cases, processor  702  may be one or more single-core processors. In other cases, processor  702  may be one or more multi-core processors with multiple independent processing units. Processor  702  may also include register memory for temporarily storing instructions being executed and related data, as well as cache memory for temporarily storing recently-used instructions and data. 
     Memory  704  may be any form of computer-usable memory, including but not limited to random access memory (RAM), read-only memory (ROM), and non-volatile memory. This may include flash memory, hard disk drives, solid state drives, re-writable compact discs (CDs), re-writable digital video discs (DVDs), and/or tape storage, as just a few examples. Computing device  700  may include fixed memory as well as one or more removable memory units, the latter including but not limited to various types of secure digital (SD) cards. Thus, memory  704  represents both main memory units, as well as long-term storage. Other types of memory may include biological memory. 
     Memory  704  may store program instructions and/or data on which program instructions may operate. By way of example, memory  704  may store these program instructions on a non-transitory, computer-readable medium, such that the instructions are executable by processor  702  to carry out any of the methods, processes, or operations disclosed in this specification or the accompanying drawings. 
     As shown in  FIG. 7 , memory  704  may include firmware  704 A, kernel  704 B, and/or applications  704 C. Firmware  704 A may be program code used to boot or otherwise initiate some or all of computing device  700 . Kernel  704 B may be an operating system, including modules for memory management, scheduling and management of processes, input/output, and communication. Kernel  704 B may also include device drivers that allow the operating system to communicate with the hardware modules (e.g., memory units, networking interfaces, ports, and busses), of computing device  700 . Applications  704 C may be one or more user-space software programs, such as web browsers or email clients, as well as any software libraries used by these programs. Memory  704  may also store data used by these and other programs and applications. 
     Network interface  706  may take the form of one or more wireline interfaces, such as Ethernet (e.g., Fast Ethernet, Gigabit Ethernet, and so on). Network interface  706  may also support communication over one or more non-Ethernet media, such as coaxial cables or power lines, or over wide-area media, such as Synchronous Optical Networking (SONET) or digital subscriber line (DSL) technologies. Network interface  706  may additionally take the form of one or more wireless interfaces, such as IEEE 802.11 (Wifi), BLUETOOTH®, global positioning system (GPS), or a wide-area wireless interface. However, other forms of physical layer interfaces and other types of standard or proprietary communication protocols may be used over network interface  706 . Furthermore, network interface  706  may comprise multiple physical interfaces. For instance, some embodiments of computing device  700  may include Ethernet, BLUETOOTH®, and Wifi interfaces. 
     Input/output unit  708  may facilitate user and peripheral device interaction with example computing device  700 . Input/output unit  708  may include one or more types of input devices, such as a keyboard, a mouse, a touch screen, and so on. Similarly, input/output unit  708  may include one or more types of output devices, such as a screen, monitor, printer, and/or one or more light emitting diodes (LEDs). Additionally or alternatively, computing device  700  may communicate with other devices using a universal serial bus (USB) or high-definition multimedia interface (HDMI) port interface, for example. 
     In some embodiments, one or more instances of computing device  700  may be deployed to support a clustered architecture. The exact physical location, connectivity, and configuration of these computing devices may be unknown and/or unimportant to client devices. Accordingly, the computing devices may be referred to as “cloud-based” devices that may be housed at various remote data center locations. 
       FIG. 8  depicts a cloud-based server cluster  800  in accordance with example embodiments. In  FIG. 8 , operations of a computing device (e.g., computing device  700 ) may be distributed between server devices  802 , data storage  804 , and routers  806 , all of which may be connected by local cluster network  808 . The number of server devices  802 , data storages  804 , and routers  806  in server cluster  800  may depend on the computing task(s) and/or applications assigned to server cluster  800 . 
     For example, server devices  802  can be configured to perform various computing tasks of computing device  700 . Thus, computing tasks can be distributed among one or more of server devices  802 . To the extent that these computing tasks can be performed in parallel, such a distribution of tasks may reduce the total time to complete these tasks and return a result. For purpose of simplicity, both server cluster  800  and individual server devices  802  may be referred to as a “server device.” This nomenclature should be understood to imply that one or more distinct server devices, data storage devices, and cluster routers may be involved in server device operations. 
     Data storage  804  may be data storage arrays that include drive array controllers configured to manage read and write access to groups of hard disk drives and/or solid state drives. The drive array controllers, alone or in conjunction with server devices  802 , may also be configured to manage backup or redundant copies of the data stored in data storage  804  to protect against drive failures or other types of failures that prevent one or more of server devices  802  from accessing units of cluster data storage  804 . Other types of memory aside from drives may be used. 
     Routers  806  may include networking equipment configured to provide internal and external communications for server cluster  800 . For example, routers  806  may include one or more packet-switching and/or routing devices (including switches and/or gateways) configured to provide (i) network communications between server devices  802  and data storage  804  via cluster network  808 , and/or (ii) network communications between the server cluster  800  and other devices via communication link  810  to network  812 . 
     Additionally, the configuration of cluster routers  806  can be based at least in part on the data communication requirements of server devices  802  and data storage  804 , the latency and throughput of the local cluster network  808 , the latency, throughput, and cost of communication link  810 , and/or other factors that may contribute to the cost, speed, fault-tolerance, resiliency, efficiency and/or other design goals of the system architecture. 
     As a possible example, data storage  804  may include any form of database, such as a structured query language (SQL) database. Various types of data structures may store the information in such a database, including but not limited to tables, arrays, lists, trees, and tuples. Furthermore, any databases in data storage  804  may be monolithic or distributed across multiple physical devices. 
     Server devices  802  may be configured to transmit data to and receive data from cluster data storage  804 . This transmission and retrieval may take the form of SQL queries or other types of database queries, and the output of such queries, respectively. Additional text, images, video, and/or audio may be included as well. Furthermore, server devices  802  may organize the received data into web page representations. Such a representation may take the form of a markup language, such as the hypertext markup language (HTML), the extensible markup language (XML), or some other standardized or proprietary format. Moreover, server devices  802  may have the capability of executing various types of computerized scripting languages, such as but not limited to Python, PHP Hypertext Preprocessor (PHP), Active Server Pages (ASP), JavaScript, and/or other languages such as C++, C#, or Java. Computer program code written in these languages may facilitate the providing of web pages to client devices, as well as client device interaction with the web pages. 
     V. EXAMPLE OPERATIONS 
       FIG. 9  is a flow chart illustrating an example embodiment. The process illustrated by  FIG. 9  may be carried out by a computing device, such as computing device  700 , and/or a cluster of computing devices, such as server cluster  800 . However, the process can be carried out by other types of devices or device subsystems. 
     The embodiment of  FIG. 9  may be simplified by the removal of any one or more of the features shown therein. For example, the embodiment may be performed without the synthesis and storing steps in some situations. Alternatively, a computing system may perform the embodiment until the synthesis and storing steps, and then instruct one or more other devices to perform those steps. Further, these embodiments may be combined with features, aspects, and/or implementations of any of the previous figures or otherwise described herein. 
     Block  900  may involve obtaining an image composed of color channels including a red color channel, a green color channel, and a blue color channel, wherein each of the color channels represents colors therein with n bits per pixel. 
     Block  902  may involve quantizing each of the color channels to be represented by m bits per pixel, wherein m is less than n. 
     Block  904  may involve using a space-filling curve to convert each of the color channels as quantized into respective vectors including a red channel vector, a green channel vector, and a blue channel vector, wherein entries in each of the respective vectors are represented by m bits. 
     Block  906  may involve generating, for each of the respective vectors, a respective set of m arrays, wherein the m arrays for a particular vector of the respective vectors contain indices of where a fixed value selected from a range of 0 to m-1 is found in the particular vector, and wherein the indices are in increasing order. 
     Block  908  may involve applying, to each of the m arrays for each of the respective vectors, differential encoding of the indices therein. 
     Block  910  may involve compressing each of the m arrays for each of the respective vectors. 
     Block  912  may involve mapping each of the m arrays for each of the respective vectors to blocks of nucleotides, wherein each block contains a unique block identifier representing a location in the m arrays of the respective vectors. 
     Block  914  may involve synthesizing the blocks of nucleotides. 
     Block  916  may involve storing, in a DNA-based storage medium, the blocks of nucleotides. 
     In some embodiments, n is 8. In some embodiments, m is 3, 4, 5, 6, or 7. 
     In some embodiments, the space-filling curve is a Hilbert curve. In some embodiments, the space-filling curve is a Peano curve. 
     In some embodiments, the differential encoding includes leaving a pre-determined percent of the indices with their original values, and identifying these indices with an integer marker that is not in the range of 0 to m-1. In some embodiments, the pre-determined percent is between 1 percent and 5 percent. In some embodiments, the pre-determined percent is 3 percent. 
     In some embodiments, the differential encoding includes placing an integer marker that is not in the range of 0 to m-1 at ends of each array. 
     In some embodiments, each of the m arrays for each of the respective vectors comprises applying Huffman encoding to each of the m arrays for each of the respective vectors. 
     In some embodiments, the blocks of nucleotides each contain an address primer and a suffix primer. 
     In some embodiments, the blocks of nucleotides contain 40 percent to 60 percent guanine and cytosine content. 
     In some embodiments, an initial k nucleotides of each unique block identifier encodes a color of a color channel from which the block was derived. In some embodiments, k is 3. 
     Some embodiments may involve: (i) performing consensus reads to obtain the blocks of nucleotides from the DNA-based storage medium; (ii) mapping the blocks of nucleotides into representations of the m arrays for each of the respective vectors; (iii) reversing the compression and differential encoding of the representations of the m arrays for each of the respective vectors; (iv) based on the space-filling curve, obtaining representations of the color channels from the representations of the m arrays for each of the respective vectors; (v) detecting, in the representations of the color channels, discolorations caused by errors, wherein each of the discolorations exists primarily in one of the color channels; (vi) inpainting the discolorations; and (vii) constructing a representation of the image from the color channels as inpainted. These embodiments may be implemented in a standalone fashion in some situations. 
     In some embodiments, the inpainting uses machine learning to combine edges in areas of the discolorations with color and texture information from other parts of the representation of the image. 
     Some embodiments may further involve smoothing, by way of bilateral filtering, the representation of the image. 
     VI. FURTHER IMPROVEMENTS INVOLVING CODING REDUNDANCY 
     The embodiments above are able to perform image storage and retrieval without adding any redundancy for error-correction of specific facial features. It can be observed that although most errors in images read out from oPools can be corrected by the automatic discoloration detection, image inpainting and post-smoothing scheme, some fine facial details like eyes and mouths may not be recovered properly. This leads to suboptimal reconstruction results, where the algorithm was unable to properly smooth out errors in the facial details like lips and cheeks without blurring the images. 
     This blurring is shown in  FIG. 10 , where image  1000  was read out from the DNA encoding without error reconstruction, and thus has artifacts obscuring facial details. Image  1002  is a refined version of image  1000 , but with blurring used to improve these details. Blurring is also shown in  FIG. 11 , where image  1100  was read out from the DNA encoding without error reconstruction, and thus has artifacts obscuring facial details. Image  1102  is a refined version of image  1100 , but with blurring used to improve these details. 
     Therefore, to further improve the reconstruction performance, a small amount of coding redundancy can be added to protect oligos that record selected facial features like eyes, noses, and lips. Considering the error rate in practice and cost efficiency, a regular, systematic low-density parity-check (LDPC) can be used with a codeword length n=1200, a number of parity-check equations involving each code bit j=3, a number of code bits involved in each parity-check equation k=12 to add the redundancy. 
     LDPC code is a linear error correcting code, a method of transmitting a message over a noisy transmission channel, such as binary symmetric channel (BSC) and additive white Gaussian noise channel (AWGN). An LDPC is constructed using a sparse Tanner graph (subclass of the bipartite graph). LDPC codes are capacity-approaching codes, which means that practical constructions exist that allow the noise threshold to be set very close to the theoretical maximum (the Shannon limit) for a symmetric memoryless channel. The noise threshold defines an upper bound for the channel noise, up to which the probability of lost information can be made as small as desired. The maximum crossover probability LDPC code can correct decreases when code rate increases. Using iterative belief propagation techniques, LDPC codes can be decoded in time linear to their block length. 
     In practice, the redundant information is coded with a parity check matrix and decoded with a generator matrix. When systematic codes are used, information bits and parity check bits can be stored separately. A parity check matrix is typically a sparse matrix, where the number of ones in a column j and number of ones in a row k defines the code rate R=1−j/k. In experiments, the (n=1200, j=3, k=12) LDPC code with code rate 3/4 was used. In the encoding procedure, the information bits related with images are then converted to DNA oligos the same as previous approach, while the generated parity check bits are first concatenated to form a long binary string, then split into sub-blocks to be converted to DNA oligos following the data organization shown in  FIG. 12 . Compared to the previous organization, there is no explicit address block, but the order of how to concatenate the binary strings read from DNA oligos is stored in the first 10 bits. These new oligos are of length 222 nucleotides. 
     Note that information about which oligos encode facial details should be included. In experiments, the indexes of those oligos are encoded according to their address blocks. Bits are then converted to DNA oligos following the arrangement of  FIG. 12 . These oligos can be repeated two times to form a 3-repition code, making the whole system more robust. The new design only requires 265+42*3=391 more oligos, which is of 391/11826=3.3% redundancy compared to previous pool without using any error-correction redundancy. 
     Significant improvements in image quality can be easily observed. In  FIG. 13 , image  1300  is an improved version of images  1000  and  1002  using LDPC-based redundant encoding. Similarly, in  FIG. 14 , image  1400  is an improved version of images  1100  and  1102  also using LDPC-based redundant encoding. 
     Thus, the embodiment of  FIG. 9  may also include identifying facial features in the image; calculating LDPC bits for the facial features; concatenating the LDPC bits into parity blocks; mapping the parity blocks to parity nucleotides; synthesizing the parity nucleotides; and storing, in the DNA-based storage medium, the parity nucleotides. Notably, parts of the image that do not represent facial features may be encoded without redundancy. 
     The facial features (e.g., eyes, nose, lips, etc.) can be manually tagged with metadata in order to indicate that they should be subject to LDPC-based coding. Alternatively or additionally, various algorithms can be used to identify the facial features in an automated or semi-automated fashion. These embodiments represent the first time that unequal error protection (where some data gets more redundancy added than other data) has been used for encoding of facial features in images stored in DNA. Conventional approaches would add parity blocks for each part of the image, regardless of the content thereof, but these approaches use more memory and computational power than the embodiments herein. Unequal error-protection in conjunction with image inpainting for image backgrounds enables significant reductions in costly error-correcting coding redundancy. 
     VII. CONCLUSION 
     The present disclosure is not to be limited in terms of the particular embodiments described in this application, which are intended as illustrations of various aspects. Many modifications and variations can be made without departing from its scope, as will be apparent to those skilled in the art. Functionally equivalent methods and apparatuses within the scope of the disclosure, in addition to those described herein, will be apparent to those skilled in the art from the foregoing descriptions. Such modifications and variations are intended to fall within the scope of the appended claims. 
     The above detailed description describes various features and operations of the disclosed systems, devices, and methods with reference to the accompanying figures. The example embodiments described herein and in the figures are not meant to be limiting. Other embodiments can be utilized, and other changes can be made, without departing from the scope of the subject matter presented herein. It will be readily understood that the aspects of the present disclosure, as generally described herein, and illustrated in the figures, can be arranged, substituted, combined, separated, and designed in a wide variety of different configurations. 
     With respect to any or all of the message flow diagrams, scenarios, and flow charts in the figures and as discussed herein, each step, block, and/or communication can represent a processing of information and/or a transmission of information in accordance with example embodiments. Alternative embodiments are included within the scope of these example embodiments. In these alternative embodiments, for example, operations described as steps, blocks, transmissions, communications, requests, responses, and/or messages can be executed out of order from that shown or discussed, including substantially concurrently or in reverse order, depending on the functionality involved. Further, more or fewer blocks and/or operations can be used with any of the message flow diagrams, scenarios, and flow charts discussed herein, and these message flow diagrams, scenarios, and flow charts can be combined with one another, in part or in whole. 
     A step or block that represents a processing of information can correspond to circuitry that can be configured to perform the specific logical functions of a herein-described method or technique. Alternatively or additionally, a step or block that represents a processing of information can correspond to a module, a segment, or a portion of program code (including related data). The program code can include one or more instructions executable by a processor for implementing specific logical operations or actions in the method or technique. The program code and/or related data can be stored on any type of computer readable medium such as a storage device including RAM, a disk drive, a solid state drive, or another storage medium. 
     The computer readable medium can also include non-transitory computer readable media such as computer readable media that store data for short periods of time like register memory and processor cache. The computer readable media can further include non-transitory computer readable media that store program code and/or data for longer periods of time. Thus, the computer readable media may include secondary or persistent long term storage, like ROM, optical or magnetic disks, solid state drives, or compact-disc read only memory (CD-ROM), for example. The computer readable media can also be any other volatile or non-volatile storage systems. A computer readable medium can be considered a computer readable storage medium, for example, or a tangible storage device. 
     Moreover, a step or block that represents one or more information transmissions can correspond to information transmissions between software and/or hardware modules in the same physical device. However, other information transmissions can be between software modules and/or hardware modules in different physical devices. 
     The particular arrangements shown in the figures should not be viewed as limiting. It should be understood that other embodiments can include more or less of each element shown in a given figure. Further, some of the illustrated elements can be combined or omitted. Yet further, an example embodiment can include elements that are not illustrated in the figures. 
     While various aspects and embodiments have been disclosed herein, other aspects and embodiments will be apparent to those skilled in the art. The various aspects and embodiments disclosed herein are for purpose of illustration and are not intended to be limiting, with the true scope being indicated by the following claims.