def do_screen(self): """usage: screen <image:pic1> <image:pic2> Pop the two top images, superimpose their inverted versions. """ import ImageChops image2 = self.do_pop() image1 = self.do_pop() self.push(ImageChops.screen(image1, image2))
def screen_mode(im, wm, wmbuffer): imsize = im.size wmsize = wm.size brightness = float(_OPACITY) / 100 brightval = int(round(255 * brightness)) wm_pos = _wm_pos(wmbuffer, imsize, wmsize) black_bg = Image.new('RGB', imsize, (0, 0, 0) ) black_bg.paste(wm, wm_pos) darkener = Image.new('RGB', imsize, (brightval, brightval, brightval) ) darkened_fit_wm = ImageChops.multiply(black_bg, darkener) return ImageChops.screen(darkened_fit_wm, im)
def contrastMask(self, outfile): """Ceci est un filtre de debouchage de photographies, aussi appelé masque de contraste, il permet de rattrapper une photo trop contrasté, un contre jour, ... Écrit par Jérôme Kieffer, avec l'aide de la liste python@aful, en particulier A. Fayolles et F. Mantegazza avril 2006 necessite numpy et PIL. @param: the name of the output file (JPEG) @return: filtered Photo instance """ try: import numpy # import scipy.signal as signal except: logger.error("This filter needs the numpy library available on https://sourceforge.net/projects/numpy/files/") return t0 = time.time() dimX, dimY = self.pil.size ImageFile.MAXBLOCK = dimX * dimY img_array = numpy.fromstring(self.pil.tostring(), dtype="UInt8").astype("float32") img_array.shape = (dimY, dimX, 3) red, green, blue = img_array[:, :, 0], img_array[:, :, 1], img_array[:, :, 2] # nota: this is faster than desat2=(ar.max(axis=2)+ar.min(axis=2))/2 desat_array = (numpy.minimum(numpy.minimum(red, green), blue) + numpy.maximum(numpy.maximum(red, green), blue)) / 2.0 inv_desat = 255. - desat_array blured_inv_desat = self._gaussian.blur(inv_desat, config.ContrastMaskGaussianSize) bisi = numpy.round(blured_inv_desat).astype("uint8") k = Image.fromarray(bisi, "L").convert("RGB") S = ImageChops.screen(self.pil, k) M = ImageChops.multiply(self.pil, k) F = ImageChops.add(ImageChops.multiply(self.pil, S), ImageChops.multiply(ImageChops.invert(self.pil), M)) dst_filename = op.join(config.DefaultRepository, outfile) F.save(dst_filename, quality=80, progressive=True, Optimize=True) try: os.chmod(dst_filename, config.DefaultFileMode) except IOError: logger.error("Unable to chmod %s" % outfile) exifJpeg = Exif(dst_filename) exifJpeg.read() self.exif.copy(exifJpeg) exifJpeg.comment = self.exif.comment logger.debug("Write metadata to %s", dst_filename) exifJpeg.write() logger.info("The whoole contrast mask took %.3f" % (time.time() - t0)) res = Photo(outfile) res.autorotate() return res
def screenMode(im, wm, opacityVal, position, wmbuffer): imsize = im.size wmsize = wm.size brightnuss = float(opacityVal) / 100 brightval = int(round(255 * brightnuss)) wmPos = wmCalculatePos(position, wmbuffer, imsize, wmsize) blackTempBG = Image.new("RGB", imsize, (0, 0, 0)) blackTempBG.paste(wm, wmPos) darkener = Image.new("RGB", imsize, (brightval, brightval, brightval)) darkenedFitWm = ImageChops.multiply(blackTempBG, darkener) out = ImageChops.screen(darkenedFitWm, im) return out
def r5(self): self.im3=ImageChops.screen(self.im,self.im0) self.tkimage.paste(self.im3)
root = Tkinter.Tk() root.resizable(0, 0) im_size = 640 image1 = Image.open('b1.png') ratio = float(image1.size[0]) / float(image1.size[1]) image1 = image1.resize((im_size, int(im_size / ratio)), Image.ANTIALIAS) tkimage1 = ImageTk.PhotoImage(image1) image2 = Image.open('b2.png') image2 = image2.resize((im_size, int(im_size / ratio)), Image.ANTIALIAS) tkimage2 = ImageTk.PhotoImage(image2) diff = ImageChops.difference(image1, image2) diff = diff.resize((im_size, int(im_size / ratio)), Image.ANTIALIAS) tk_diff = ImageTk.PhotoImage(diff) overlay = ImageChops.screen(image1, image2) overlay = overlay.resize((im_size, int(im_size / ratio)), Image.ANTIALIAS) tk_overlay = ImageTk.PhotoImage(overlay) root.geometry('%dx%d' % (image1.size[0] * 2, image1.size[1] * 2)) label_image1 = Tkinter.Label(root, image=tkimage1) label_image2 = Tkinter.Label(root, image=tkimage2) label_diff = Tkinter.Label(root, image=tk_diff) label_overlay = Tkinter.Label(root, image=tk_overlay) label_image1.place(x=0, y=0, width=im_size, height=int(im_size / ratio)) label_image2.place(x=im_size, y=0, width=im_size, height=int(im_size / ratio)) label_diff.place(x=0, y=int(im_size / ratio), width=im_size, height=int(im_size / ratio))
def contrastMask(self, outfile): """Ceci est un filtre de debouchage de photographies, aussi appelé masque de contraste, il permet de rattrapper une photo trop contrasté, un contre jour, ... Écrit par Jérôme Kieffer, avec l'aide de la liste python@aful, en particulier A. Fayolles et F. Mantegazza avril 2006 necessite numpy et PIL. @param: the name of the output file (JPEG) @return: filtered Photo instance """ try: import numpy # import scipy.signal as signal except: logger.error("This filter needs the numpy library available on https://sourceforge.net/projects/numpy/files/") return t0 = time.time() dimX, dimY = self.pil.size ImageFile.MAXBLOCK = dimX * dimY img_array = numpy.fromstring(self.pil.tostring(), dtype="UInt8").astype("float32") img_array.shape = (dimY, dimX, 3) red, green, blue = img_array[:, :, 0], img_array[:, :, 1], img_array[:, :, 2] #nota: this is faster than desat2=(ar.max(axis=2)+ar.min(axis=2))/2 desat_array = (numpy.minimum(numpy.minimum(red, green), blue) + numpy.maximum(numpy.maximum(red, green), blue)) / 2.0 inv_desat = 255. - desat_array blured_inv_desat = self._gaussian.blur(inv_desat, config.ContrastMaskGaussianSize) bisi = numpy.round(blured_inv_desat).astype("uint8") k = Image.fromarray(bisi, "L").convert("RGB") S = ImageChops.screen(self.pil, k) M = ImageChops.multiply(self.pil, k) F = ImageChops.add(ImageChops.multiply(self.pil, S), ImageChops.multiply(ImageChops.invert(self.pil), M)) exitJpeg = op.join(config.DefaultRepository, outfile) F.save(exitJpeg, quality=80, progressive=True, Optimize=True) try: os.chmod(exitJpeg, config.DefaultFileMode) except IOError: logger.error("Unable to chmod %s" % outfile) exifJpeg = Exif(exitJpeg) exifJpeg.read() self.exif.copy(exifJpeg) exifJpeg.comment = self.exif.comment # # for metadata in [ 'Exif.Image.Make', 'Exif.Image.Model', 'Exif.Photo.DateTimeOriginal', # 'Exif.Photo.ExposureTime', 'Exif.Photo.FNumber', 'Exif.Photo.ExposureBiasValue', # 'Exif.Photo.Flash', 'Exif.Photo.FocalLength', 'Exif.Photo.ISOSpeedRatings', # "Exif.Image.Orientation", "Exif.Photo.UserComment" # ]: # if metadata in self.exif: # logger.debug("Copying metadata %s", metadata) # try: # exifJpeg[metadata] = self.exif[metadata] # except KeyError: # pass #'Tag not set'-> unable to copy it # except: # logger.error("Unable to copying metadata %s in file %s, value: %s" % (metadata, self.filename, self.exif[metadata])) logger.debug("Write metadata to %s", exitJpeg) exifJpeg.write() logger.info("The whoole contrast mask took %.3f" % (time.time() - t0)) return Photo(outfile)
root = Tkinter.Tk() root.resizable(0,0) im_size = 640 image1 = Image.open('b1.png') ratio = float(image1.size[0]) / float(image1.size[1]) image1 = image1.resize((im_size,int(im_size / ratio)), Image.ANTIALIAS) tkimage1 = ImageTk.PhotoImage(image1) image2 = Image.open('b2.png') image2 = image2.resize((im_size,int(im_size / ratio)), Image.ANTIALIAS) tkimage2 = ImageTk.PhotoImage(image2) diff = ImageChops.difference(image1, image2) diff = diff.resize((im_size,int(im_size / ratio)), Image.ANTIALIAS) tk_diff = ImageTk.PhotoImage(diff) overlay = ImageChops.screen(image1, image2) overlay = overlay.resize((im_size,int(im_size / ratio)), Image.ANTIALIAS) tk_overlay = ImageTk.PhotoImage(overlay) root.geometry('%dx%d' % (image1.size[0] * 2,image1.size[1] * 2)) label_image1 = Tkinter.Label(root, image=tkimage1) label_image2 = Tkinter.Label(root, image=tkimage2) label_diff = Tkinter.Label(root, image=tk_diff) label_overlay = Tkinter.Label(root, image=tk_overlay) label_image1.place(x=0,y=0,width=im_size,height=int(im_size/ratio)) label_image2.place(x=im_size,y=0,width=im_size,height=int(im_size/ratio)) label_diff.place(x=0,y=int(im_size/ratio),width=im_size,height=int(im_size/ratio)) label_overlay.place(x=im_size,y=int(im_size/ratio),width=im_size,height=int(im_size/ratio)) root.title("Image diff")
def merge_layers_screen(layer1, layer2, opacity2): opacity2 = max(min(opacity2, 1), 0) if opacity2 < 1: layer2 = _set_opacity_layer(layer2, opacity2) return ImageChops.screen(layer1, layer2)
is_sand = morphology.binary_closing(opened, se) # Use coral mask to exclude sand. is_sand = is_sand & ~is_coral return is_sand, is_coral import glob #for fname in sorted(glob.glob("/media/spanky/thesis-revision/datasets/B/*.png")): for fname in sorted(glob.glob("./coral_imagery/TIFF/*.tif")): print fname img = Image.open(fname) # Values from SSF work #sand, coral = jeff_coral_finder(img, 205, 15, 8, 85, [.33333,.33333,.33333]) # Values from Training set #sand, coral = jeff_coral_finder(img, 189, 11, 8, 50.4858, [.7762,.2288,-.5874]) # Chris's values for dataset B sand, coral = jeff_coral_finder(img, 255, 30, 8, 30, [.3333, .3333,.3333]) # Now generate a composite image. orange_mask = N.dstack((coral, coral, coral)) * [200, 168, 50] green_mask = N.dstack((sand, sand, sand)) * [255, 190, 190] green_mask[green_mask==0] = 255 orange_mask = Image.fromarray(N.cast['uint8'](orange_mask)) green_mask = Image.fromarray(N.cast['uint8'](green_mask)) masked = ImageChops.multiply(img, green_mask) masked = ImageChops.screen(masked, orange_mask) new_fname = "output/masked-" + fname.rpartition("/")[2] print new_fname masked.save(new_fname)