Source code for displayarray.effects.select_channels

"""Reduce many color images to the three colors that your eyeballs can see."""

import numpy as np
from ..input import mouse_loop
import cv2

from typing import Iterable


[docs]class SelectChannels(object): """ Select channels to display from an array with too many colors. :param selected_channels: the list of channels to display. """ def __init__(self, selected_channels: Iterable[int] = None): """Select which channels from the input array to display in the output.""" if selected_channels is None: selected_channels = [0, 0, 0] self.selected_channels = selected_channels self.mouse_control = None self.mouse_print_channels = False self.num_input_channels = None def __call__(self, arr): """Run the channel selector.""" self.num_input_channels = arr.shape[-1] out_arr = [ arr[..., min(max(0, x), arr.shape[-1] - 1)] for x in self.selected_channels ] out_arr = np.stack(out_arr, axis=-1) return out_arr
[docs] def enable_mouse_control(self): """ Enable mouse control. Alt+Scroll to increase/decrease channel 2. Shift+Scroll to increase/decrease channel 1. Ctrl+scroll to increase/decrease channel 0. """ @mouse_loop def m_loop(me): if me.event == cv2.EVENT_MOUSEWHEEL: if me.flags & cv2.EVENT_FLAG_CTRLKEY: if me.flags > 0: self.selected_channels[0] += 1 self.selected_channels[0] = min( self.selected_channels[0], self.num_input_channels - 1 ) else: self.selected_channels[0] -= 1 self.selected_channels[0] = max(self.selected_channels[0], 0) if self.mouse_print_channels: print(f"Channel 0 now maps to {self.selected_channels[0]}.") elif me.flags & cv2.EVENT_FLAG_SHIFTKEY: if me.flags > 0: self.selected_channels[1] += 1 self.selected_channels[1] = min( self.selected_channels[1], self.num_input_channels - 1 ) else: self.selected_channels[1] -= 1 self.selected_channels[1] = max(self.selected_channels[1], 0) if self.mouse_print_channels: print(f"Channel 1 now maps to {self.selected_channels[1]}.") elif me.flags & cv2.EVENT_FLAG_ALTKEY: if me.flags > 0: self.selected_channels[2] += 1 self.selected_channels[2] = min( self.selected_channels[2], self.num_input_channels - 1 ) else: self.selected_channels[2] -= 1 self.selected_channels[2] = max(self.selected_channels[2], 0) if self.mouse_print_channels: print(f"Channel 2 now maps to {self.selected_channels[2]}.") self.mouse_control = m_loop