Removing eye blink artefacts without EOG channels using ICA

  • MNE version: 1.2.2
  • operating system: Windows 10

Hi there,

I have a 24 channel raw EEG data. I have applied ICA to removed muscle artefacts and I’m trying to remove eye blink artefacts. I don’t have any EOG channels. So here’s my question-- is it possible to remove blink artefacts using ICA using an algorithm the way it’s possible to remove muscle artefacts?


Yes, simply specify which EEG channel to use for finding the ocular activity.

Best wishes,

So, can we select any eeg channel for this purpose or are there some conditions that we should look for?


You should select an EEG channel that exhibits the ocular artifacts, e.g. Fp1 or Fp2.

1 Like

Thank you for the reply Mathieu,
I did select the Fp1 channel based on visual inspection but my concern was if I want to do this for multiple subjects, should I keep the channels as Fp1 or is there a way to update this channel? Or this selection of channel i.e. Fp1 is just for reference and would not affect the overall blink removal performance?


Fp1 should work for all subjects as those frontal channels will always capture ocular artifacts due to their proximity with the eye muscles.
You could also use mne-icalabel to label the components using the ICLabel network which does not require any specific channel.

1 Like

Thank you again!

I tried using mne-icalabel, it’s working perfectly. Just one question regarding,

In the tutorial, this is mentioned as such:

pick some channels that clearly show heartbeats and blinks

artifact_picks = mne.pick_channels_regexp(raw.ch_names, regexp=r"(EEG 00.)")
raw.plot(order=artifact_picks, n_channels=len(artifact_picks), show_scrollbars=False)

So my questions are – what is artifact_picks recording? and Can we input any channel into ‘regexp’?

I tried going through the documentation, it said it gives indices of good channels but that didn’t help since already records that. So what’s the point of it anyway?


That part of the tutorial is to explain what the goal of the ICA is, what do the artifacts look like in the time-domain.
pick_channels_regexp is one of the many different ways to select channels in MNE. In this case, it selected all channels which matched the regular expression "(EEG 00.)", i.e. EEG 001 to EEG 009. The picks are used in the next line to limit the plot to those channels only.

The limitation is a bit ‘hidden’ because Adam chose to limit the number of displayed channels (n_channels) and sorting the channels to move those 9 channels to the top; instead of selecting the channels and then plotting. It’s equivalent to:

picks = mne.pick_channels_regexp(raw.ch_names, regexp=r"(EEG 00.)")

That said, this is only used to provide a visual EEG artifacted signal and to explain what we try to recover by removing ICs. If you want to apply the ICLabel network to your EEG dataset, you only need to make sure you pass only the EEG channels to the ICA/ICLabel net, e.g. by selecting channels by type: raw.pick_types(eeg=True) (if there are other channels in your recordings).

Thanks for the help!