text: import smbus
  import time
  import webcolors
  from PIL import Image
  
  def closest_colour(average_color):
      min_colours = {}
      for key, name in webcolors.css3_hex_to_names.items():
          r_c, g_c, b_c = webcolors.hex_to_rgb(key)
          rd = (r_c - average_color[0]) ** 2
          gd = (g_c - average_color[1]) ** 2
          bd = (b_c - average_color[2]) ** 2
          min_colours[(rd + gd + bd)] = name
      return min_colours[min(min_colours.keys())]
  
  def get_colour_name(average_color):
      try:
          closest_name = actual_name = webcolors.rgb_to_name(average_color)
      except ValueError:
          closest_name = closest_colour(average_color)
          actual_name = None
      return actual_name, closest_name
  
  def resize(img):
      basewidth = 25
      wpercent = (basewidth/float(img.size[0]))
      hsize = int((float(img.size[1])*float(wpercent)))
      img = img.resize((basewidth,hsize), Image.ANTIALIAS)
      img.save('camres.jpg')
  
  def compute_average_image_color(imgres):
      width, height = img.size
  
      r_total = 0
      g_total = 0
      b_total = 0
  
      count = 0
      for x in range(0, width):
          for y in range(0, height):
              r, g, b = img.getpixel((x,y))
              r_total += r
              g_total += g
              b_total += b
              count += 1
  
      return (r_total/count, g_total/count, b_total/count)
  
  
  
  
  # Define some device parameters
  I2C_ADDR = 0x3f  # I2C device address
  LCD_WIDTH = 16  # Maximum characters per line
  
  # Define some device constants
  LCD_CHR = 1  # Mode - Sending data
  LCD_CMD = 0  # Mode - Sending command
  
  LCD_LINE_1 = 0x80  # LCD RAM address for the 1st line
  LCD_LINE_2 = 0xC0  # LCD RAM address for the 2nd line
  LCD_LINE_3 = 0x94  # LCD RAM address for the 3rd line
  LCD_LINE_4 = 0xD4  # LCD RAM address for the 4th line
  
  LCD_BACKLIGHT = 0x08  # On
  # LCD_BACKLIGHT = 0x00  # Off
  
  ENABLE = 0b00000100  # Enable bit
  
  # Timing constants
  E_PULSE = 0.0005
  E_DELAY = 0.0005
  
  # Open I2C interface
  # bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
  bus = smbus.SMBus(1)  # Rev 2 Pi uses 1
  
  
  def lcd_init():
      # Initialise display
      lcd_byte(0x33, LCD_CMD)  # 110011 Initialise
      lcd_byte(0x32, LCD_CMD)  # 110010 Initialise
      lcd_byte(0x06, LCD_CMD)  # 000110 Cursor move direction
      lcd_byte(0x0C, LCD_CMD)  # 001100 Display On,Cursor Off, Blink Off
      lcd_byte(0x28, LCD_CMD)  # 101000 Data length, number of lines, font size
      lcd_byte(0x01, LCD_CMD)  # 000001 Clear display
      time.sleep(E_DELAY)
  
  
  def lcd_byte(bits, mode):
      # Send byte to data pins
      # bits = the data
      # mode = 1 for data
      #        0 for command
  
      bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
      bits_low = mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT
  
      # High bits
      bus.write_byte(I2C_ADDR, bits_high)
      lcd_toggle_enable(bits_high)
  
      # Low bits
      bus.write_byte(I2C_ADDR, bits_low)
      lcd_toggle_enable(bits_low)
  
  
  def lcd_toggle_enable(bits):
      # Toggle enable
      time.sleep(E_DELAY)
      bus.write_byte(I2C_ADDR, (bits | ENABLE))
      time.sleep(E_PULSE)
      bus.write_byte(I2C_ADDR, (bits & ~ENABLE))
      time.sleep(E_DELAY)
  
  
  def lcd_string(message, line):
      # Send string to display
  
      message = message.ljust(LCD_WIDTH, " ")
  
      lcd_byte(line, LCD_CMD)
  
      for i in range(LCD_WIDTH):
          lcd_byte(ord(message[i]), LCD_CHR)
  
  
  
  lcd_init()
  
  img = Image.open('cam.jpg')
  resize(img)
  imgres = Image.open('camres.jpg')
  # img = img.resize((50,50))  # Small optimization
  average_color = compute_average_image_color(imgres)
  actual_name, closest_name = get_colour_name(average_color)
  print(average_color)
  print("Actual colour name:", actual_name, ", closest colour name:", closest_name)
  
  lcd_string("Color : ", LCD_LINE_1)
  lcd_string(closest_name, LCD_LINE_2)
  
  time.sleep(10)
  
  
  
  if __name__ == '__main__':
  
      try:
          main()
      except KeyboardInterrupt:
          pass
      finally:
          lcd_byte(0x01, LCD_CMD)
  
  
  